PHP設(shè)計模式之解釋器模式的深入解析
解釋器(Interpreter)模式,它包括一個具有復合類分層結(jié)構(gòu)的文法表現(xiàn),規(guī)則是映射到類,跟隨在文法后面的表達式可以被轉(zhuǎn)換成一個抽象的語法樹,除了復合模式的實例對象圖外,沒有別的內(nèi)容。
樹是一個抽象的名詞,因為實際上大多數(shù)時候它是一個表達式的抽象表現(xiàn),它忽略了可能有一個字符串,也可能有一個數(shù)據(jù)結(jié)構(gòu)的具體表達式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具體表現(xiàn)),通過邏輯規(guī)則解耦結(jié)果,使解釋過程大大簡化。
解釋器不是一個很常見的模式,但對于簡單的語法,它添加一個規(guī)則就象添加一個類那樣容易,但它沒有解決從具體表現(xiàn)形式到抽象語法樹的轉(zhuǎn)換,這是由其它服務(wù)完成的。
解釋器模式旨在為一個簡單的抽象表達式(AbstractExpression)方法(解釋器操作)實現(xiàn)利用復合分層結(jié)構(gòu),解釋器操作的參數(shù)通常統(tǒng)稱為上下文,對于給定的一個方法,它們通常被計算值代替,或它們對某些操作可能不存在。
同樣,當包含一個解釋器時,復合模式的葉子和容器參與者名稱會不一樣,這些名稱反映了它們所扮演的角色:終結(jié)符(terminal)或非終結(jié)符(nonterminal)表達式。
參與者:
◆客戶端(Client):使用解釋操作。
◆抽象表達式(AbstractExpression):基于一個表達式樹抽象。
◆非終結(jié)符表達式(NonTerminalExpression):遞歸地包含其它抽象表達式(AbstractExpression實例)的表達式。
◆終結(jié)符表達式(TerminalExpression):不能夠進一步簡化的表達式。
《設(shè)計模式》一書針對這個模式提供了一個擴展示例,我將使用數(shù)學表達式替換布爾表達式重新改造了一下,因此這個例子解決了一個數(shù)學表達式的展現(xiàn),它的evaluate( )被分離在一個不同的ConcreteExpression類中。
/**
* AbstractExpression. All implementations of this interface
* are ConcreteExpressions.
*/
interface MathExpression
{
/**
* Calculates the value assumed by the expression.
* Note that $values is passed to all expression but it
* is used by Variable only. This is required to abstract
* away the tree structure.
*/
public function evaluate(array $values);
}
/**
* A terminal expression which is a literal value.
*/
class Literal implements MathExpression
{
private $_value;
public function __construct($value)
{
$this->_value = $value;
}
public function evaluate(array $values)
{
return $this->_value;
}
}
/**
* A terminal expression which represents a variable.
*/
class Variable implements MathExpression
{
private $_letter;
public function __construct($letter)
{
$this->_letter = $letter;
}
public function evaluate(array $values)
{
return $values[$this->_letter];
}
}
/**
* Nonterminal expression.
*/
class Sum implements MathExpression
{
private $_a;
private $_b;
public function __construct(MathExpression $a, MathExpression $b)
{
$this->_a = $a;
$this->_b = $b;
}
public function evaluate(array $values)
{
return $this->_a->evaluate($values) + $this->_b->evaluate($values);
}
}
/**
* Nonterminal expression.
*/
class Product implements MathExpression
{
private $_a;
private $_b;
public function __construct(MathExpression $a, MathExpression $b)
{
$this->_a = $a;
$this->_b = $b;
}
public function evaluate(array $values)
{
return $this->_a->evaluate($values) * $this->_b->evaluate($values);
}
}
// 10(a + 3)
$expression = new Product(new Literal(10), new Sum(new Variable('a'), new Literal(3)));
echo $expression->evaluate(array('a' => 4)), "\n";
// adding new rules to the grammar is easy:
// e.g. Power, Subtraction...
// thanks to the Composite, manipulation is even simpler:
// we could add substitute($letter, MathExpression $expr)
// to the interface...
相關(guān)文章
php5.5使用PHPMailer-5.2發(fā)送郵件的完整步驟
PHPMailer已經(jīng)更新了很多版本了,本教程只針對老版本。下面這篇文章主要給大家介紹了關(guān)于php5.5使用PHPMailer-5.2發(fā)送郵件的完整步驟,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2018-10-10
PHP實現(xiàn)的服務(wù)器一致性hash分布算法示例
這篇文章主要介紹了PHP實現(xiàn)的服務(wù)器一致性hash分布算法,結(jié)合實例形式分析了php一致性hash分布算法類的具體定義與相關(guān)使用技巧,需要的朋友可以參考下2018-08-08
PHP時間日期增減操作示例【date strtotime實現(xiàn)加一天、加一月等操作】
這篇文章主要介紹了PHP時間日期增減操作,結(jié)合實例形式分析了php使用date、strtotime等函數(shù)實現(xiàn)加一天、加一月等運算相關(guān)實現(xiàn)技巧與問題解決方法,需要的朋友可以參考下2018-12-12

