設計模式之解釋器模式–語法解釋器的實現原理
解釋器模式
就是把一個東西解釋成另外一個東西,比如中文解釋成英文。
給定一個語言,定義它的文法的一種表示,比定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
爲什麼要使用解釋器模式
當你需要解釋一個東西的時候,這個模式才能發生作用。
這個模式在實際項目中用的比較少,除非寫一些通用框架的時候纔會用到。一般在框架和語言層面使用。
比如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上面。