设计模式之解释器模式–语法解释器的实现原理
解释器模式
就是把一个东西解释成另外一个东西,比如中文解释成英文。
给定一个语言,定义它的文法的一种表示,比定义一个解释器,这个解释器使用该表示来解释语言中的句子。
为什么要使用解释器模式
当你需要解释一个东西的时候,这个模式才能发生作用。
这个模式在实际项目中用的比较少,除非写一些通用框架的时候才会用到。一般在框架和语言层面使用。
比如java
解释器,php
解释器这些语言解释器,还有mysql里面的语法解释器这些需特定语法的才需要这个模式。
比如正则
,当使用正则的时候就会使用到正则解释器
。
当有一个语言需要解释执行,并且你可以将这个语言中的句子表示为一个抽象语法树时,可使用解释器模式。
比如实现一个数学解释器
php实现解释器模式
首先实现一个解释器父类
/**
* 解释器模式
* 语法解释器父类
*/
abstract class Expression {
/**
* 解释器方法
* 负责解释语法
* 接受一个解释文本类
*/
function interpreter(Context $ctx) {
$arr = explode(' ', $ctx->text);
//取出相加的两个数和符号
$num1 = array_shift($arr);
$symbol = array_shift($arr);
$num2 = array_shift($arr);
//把已经解释的文本去掉
$ctx->text = implode(' ', $arr);
//调用具体的语法解释器
$this->exec($num1, $num2, $symbol);
}
/**
* 具体的语法解释执行
*/
abstract function exec($num1, $num2, $symbol);
}
接下来实现一个加法解释器
/**
* 解释器模式
* 加法解释器
*/
class plus extends Expression {
/**
* 具体的语法解释执行
*/
function exec($num1, $num2, $symbol) {
if ($symbol == '+') {
dump($num1 + $num2);
}
}
}
在来一个解释文本类,负责装着文本。
/**
* 解释器模式
* 解释文本
*/
class Context {
public $text;
}
现在看一下客户端调用
$ctx = new Context;
$ctx->text = '1 + 1';
$plus = new plus;
$plus->interpreter($ctx);
经过解释器解析后输出下面的内容
2
可以看到解释器发生了作用。
解释器的结构
- 抽象解释类
- 具体解释类
- 解释文本
代码放在了我的github上面。