Home >Backend Development >PHP Tutorial >PHP设计模式漫谈之解释器模式_PHP

PHP设计模式漫谈之解释器模式_PHP

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-01 12:20:30946browse

PHP设计模式漫谈系列已经连载的四周,我们了解了PHP设计模式中的代理模式、责任链模式、结构模式命令模式。我们今天的主角是解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容。

欲了解更多关于PHP设计模式的内容,欢迎访问:PHP设计模式漫谈

树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化。

解释器不是一个很常见的模式,但对于简单的语法,它添加一个规则就象添加一个类那样容易,但它没有解决从具体表现形式到抽象语法树的转换,这是由其它服务完成的。

解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。

同样,当包含一个解释器时,复合模式的叶子和容器参与者名称会不一样,这些名称反映了它们所扮演的角色:终结符(terminal)或非终结符(nonterminal)表达式。

参与者:

◆客户端(Client):使用解释操作。

◆抽象表达式(AbstractExpression):基于一个表达式树抽象。

◆非终结符表达式(NonTerminalExpression):递归地包含其它抽象表达式(AbstractExpression实例)的表达式。

◆终结符表达式(TerminalExpression):不能够进一步简化的表达式。

PHP设计模式中的解释器模式 
解释器模式示例

《设计模式》一书针对这个模式提供了一个扩展示例,我将使用数学表达式替换布尔表达式重新改造了一下,因此这个例子解决了一个数学表达式的展现,它的evaluate( )被分离在一个不同的ConcreteExpression类中。

<ol class="dp-c">
<li class="alt"><span><span><!--p  </sp--></span></span></li>
<li>
<span class="comment"><font color="#008200">/** </font></span> </li>
<li class="alt"><span><span class="comment"><font color="#008200"> * AbstractExpression. All implementations of this interface </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> * are ConcreteExpressions. </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li>
<span class="keyword"><strong><font color="#006699">interface</font></strong></span><span> MathExpression  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>    </span><span class="comment"><font color="#008200">/** </font></span> </li>
<li class="alt"><span><span class="comment"><font color="#008200">     * Calculates the value assumed by the expression. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200">     * Note that $values is passed to all expression but it </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200">     * is used by Variable only. This is required to abstract </font></span> </span></li>
<li><span><span class="comment"><font color="#008200">     * away the tree structure. </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200">     */</font></span><span> </span></span></li>
<li>
<span>    </span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">function</font></strong></span><span> evaluate(</span><span class="keyword"><strong><font color="#006699">array</font></strong></span><span> </span><span class="vars"><font color="#dd0000">$values</font></span><span>);  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="comment"><font color="#008200">/** </font></span> </li>
<li><span><span class="comment"><font color="#008200"> * A terminal expression which is a literal value. </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li>
<span class="keyword"><strong><font color="#006699">class</font></strong></span><span> Literal </span><span class="keyword"><strong><font color="#006699">implements</font></strong></span><span> MathExpression  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>    </span><span class="keyword"><strong><font color="#006699">private</font></strong></span><span> </span><span class="vars"><font color="#dd0000">PHP设计模式漫谈系列已经连载的四周,我们了解了PHP设计模式中的代理模式、责任链模式、<font color="#0000ff">结构模式</font>和<font color="#0000ff">命令模式</font>。我们今天的主角是解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容。
<p>欲了解更多关于PHP设计模式的内容,欢迎访问:<font color="#0000ff">PHP设计模式漫谈</font></p>
<p>树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化。</p>
<p>解释器不是一个很常见的模式,但对于简单的语法,它添加一个规则就象添加一个类那样容易,但它没有解决从具体表现形式到抽象语法树的转换,这是由其它服务完成的。</p>
<p><strong>解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。</strong></p>
<p>同样,当包含一个解释器时,复合模式的叶子和容器参与者名称会不一样,这些名称反映了它们所扮演的角色:终结符(terminal)或非终结符(nonterminal)表达式。</p>
<p><strong>参与者:</strong></p>
<p>◆客户端(Client):使用解释操作。</p>
<p>◆抽象表达式(AbstractExpression):基于一个表达式树抽象。</p>
<p>◆非终结符表达式(NonTerminalExpression):递归地包含其它抽象表达式(AbstractExpression实例)的表达式。</p>
<p>◆终结符表达式(TerminalExpression):不能够进一步简化的表达式。</p>
<p style="TEXT-ALIGN: center"><img class="fit-image" onmousewheel="javascript:return big(this)"    style="max-width:90%" alt="PHP设计模式中的解释器模式" src="http://img.bitscn.com/upimg/allimg/100422/1601191602-0.jpg"  style="max-width:90%" onload="javascript:if(this.width>498)this.style.width=498;" border="0"> <br>解释器模式示例</p>
<p>《设计模式》一书针对这个模式提供了一个扩展示例,我将使用数学表达式替换布尔表达式重新改造了一下,因此这个例子解决了一个数学表达式的展现,它的evaluate( )被分离在一个不同的ConcreteExpression类中。</p>
<pre class="brush:php;toolbar:false">___FCKpd___0

我们会在下周继续为您连载PHP设计模式漫谈系列文章,敬请期待。

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 PHP设计模式漫谈系列已经连载的四周,我们了解了PHP设计模式中的代理模式、责任链模式、结构模式命令模式。我们今天的主角是解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容。

    欲了解更多关于PHP设计模式的内容,欢迎访问:PHP设计模式漫谈

    树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化。

    解释器不是一个很常见的模式,但对于简单的语法,它添加一个规则就象添加一个类那样容易,但它没有解决从具体表现形式到抽象语法树的转换,这是由其它服务完成的。

    解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。

    同样,当包含一个解释器时,复合模式的叶子和容器参与者名称会不一样,这些名称反映了它们所扮演的角色:终结符(terminal)或非终结符(nonterminal)表达式。

    参与者:

    ◆客户端(Client):使用解释操作。

    ◆抽象表达式(AbstractExpression):基于一个表达式树抽象。

    ◆非终结符表达式(NonTerminalExpression):递归地包含其它抽象表达式(AbstractExpression实例)的表达式。

    ◆终结符表达式(TerminalExpression):不能够进一步简化的表达式。

    PHP设计模式中的解释器模式 
    解释器模式示例

    《设计模式》一书针对这个模式提供了一个扩展示例,我将使用数学表达式替换布尔表达式重新改造了一下,因此这个例子解决了一个数学表达式的展现,它的evaluate( )被分离在一个不同的ConcreteExpression类中。

    ___FCKpd___0

    我们会在下周继续为您连载PHP设计模式漫谈系列文章,敬请期待。

    letter
    ;  
  •  
  •     public function __construct($letter)  
  •     {  
  •         $this->_letter = $letter;  
  •     }  
  •  
  •     public function evaluate(array $values)  
  •     {  
  •         return $values[$this->_letter];  
  •     }  
  • }  
  •  
  • /**  
  •  * Nonterminal expression.  
  •  */ 
  • class Sum implements MathExpression  
  • {  
  •     private PHP设计模式漫谈系列已经连载的四周,我们了解了PHP设计模式中的代理模式、责任链模式、结构模式命令模式。我们今天的主角是解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容。

    欲了解更多关于PHP设计模式的内容,欢迎访问:PHP设计模式漫谈

    树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化。

    解释器不是一个很常见的模式,但对于简单的语法,它添加一个规则就象添加一个类那样容易,但它没有解决从具体表现形式到抽象语法树的转换,这是由其它服务完成的。

    解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。

    同样,当包含一个解释器时,复合模式的叶子和容器参与者名称会不一样,这些名称反映了它们所扮演的角色:终结符(terminal)或非终结符(nonterminal)表达式。

    参与者:

    ◆客户端(Client):使用解释操作。

    ◆抽象表达式(AbstractExpression):基于一个表达式树抽象。

    ◆非终结符表达式(NonTerminalExpression):递归地包含其它抽象表达式(AbstractExpression实例)的表达式。

    ◆终结符表达式(TerminalExpression):不能够进一步简化的表达式。

    PHP设计模式中的解释器模式 
    解释器模式示例

    《设计模式》一书针对这个模式提供了一个扩展示例,我将使用数学表达式替换布尔表达式重新改造了一下,因此这个例子解决了一个数学表达式的展现,它的evaluate( )被分离在一个不同的ConcreteExpression类中。

    ___FCKpd___0

    我们会在下周继续为您连载PHP设计模式漫谈系列文章,敬请期待。

    a
    ;  
  •     private PHP设计模式漫谈系列已经连载的四周,我们了解了PHP设计模式中的代理模式、责任链模式、结构模式命令模式。我们今天的主角是解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容。

    欲了解更多关于PHP设计模式的内容,欢迎访问:PHP设计模式漫谈

    树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化。

    解释器不是一个很常见的模式,但对于简单的语法,它添加一个规则就象添加一个类那样容易,但它没有解决从具体表现形式到抽象语法树的转换,这是由其它服务完成的。

    解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。

    同样,当包含一个解释器时,复合模式的叶子和容器参与者名称会不一样,这些名称反映了它们所扮演的角色:终结符(terminal)或非终结符(nonterminal)表达式。

    参与者:

    ◆客户端(Client):使用解释操作。

    ◆抽象表达式(AbstractExpression):基于一个表达式树抽象。

    ◆非终结符表达式(NonTerminalExpression):递归地包含其它抽象表达式(AbstractExpression实例)的表达式。

    ◆终结符表达式(TerminalExpression):不能够进一步简化的表达式。

    PHP设计模式中的解释器模式 
    解释器模式示例

    《设计模式》一书针对这个模式提供了一个扩展示例,我将使用数学表达式替换布尔表达式重新改造了一下,因此这个例子解决了一个数学表达式的展现,它的evaluate( )被分离在一个不同的ConcreteExpression类中。

    ___FCKpd___0

    我们会在下周继续为您连载PHP设计模式漫谈系列文章,敬请期待。

    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 PHP设计模式漫谈系列已经连载的四周,我们了解了PHP设计模式中的代理模式、责任链模式、结构模式命令模式。我们今天的主角是解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容。

    欲了解更多关于PHP设计模式的内容,欢迎访问:PHP设计模式漫谈

    树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化。

    解释器不是一个很常见的模式,但对于简单的语法,它添加一个规则就象添加一个类那样容易,但它没有解决从具体表现形式到抽象语法树的转换,这是由其它服务完成的。

    解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。

    同样,当包含一个解释器时,复合模式的叶子和容器参与者名称会不一样,这些名称反映了它们所扮演的角色:终结符(terminal)或非终结符(nonterminal)表达式。

    参与者:

    ◆客户端(Client):使用解释操作。

    ◆抽象表达式(AbstractExpression):基于一个表达式树抽象。

    ◆非终结符表达式(NonTerminalExpression):递归地包含其它抽象表达式(AbstractExpression实例)的表达式。

    ◆终结符表达式(TerminalExpression):不能够进一步简化的表达式。

    PHP设计模式中的解释器模式 
    解释器模式示例

    《设计模式》一书针对这个模式提供了一个扩展示例,我将使用数学表达式替换布尔表达式重新改造了一下,因此这个例子解决了一个数学表达式的展现,它的evaluate( )被分离在一个不同的ConcreteExpression类中。

    ___FCKpd___0

    我们会在下周继续为您连载PHP设计模式漫谈系列文章,敬请期待。

    a
    ;  
  •     private PHP设计模式漫谈系列已经连载的四周,我们了解了PHP设计模式中的代理模式、责任链模式、结构模式命令模式。我们今天的主角是解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容。

    欲了解更多关于PHP设计模式的内容,欢迎访问:PHP设计模式漫谈

    树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化。

    解释器不是一个很常见的模式,但对于简单的语法,它添加一个规则就象添加一个类那样容易,但它没有解决从具体表现形式到抽象语法树的转换,这是由其它服务完成的。

    解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。

    同样,当包含一个解释器时,复合模式的叶子和容器参与者名称会不一样,这些名称反映了它们所扮演的角色:终结符(terminal)或非终结符(nonterminal)表达式。

    参与者:

    ◆客户端(Client):使用解释操作。

    ◆抽象表达式(AbstractExpression):基于一个表达式树抽象。

    ◆非终结符表达式(NonTerminalExpression):递归地包含其它抽象表达式(AbstractExpression实例)的表达式。

    ◆终结符表达式(TerminalExpression):不能够进一步简化的表达式。

    PHP设计模式中的解释器模式 
    解释器模式示例

    《设计模式》一书针对这个模式提供了一个扩展示例,我将使用数学表达式替换布尔表达式重新改造了一下,因此这个例子解决了一个数学表达式的展现,它的evaluate( )被分离在一个不同的ConcreteExpression类中。

    ___FCKpd___0

    我们会在下周继续为您连载PHP设计模式漫谈系列文章,敬请期待。

    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... 
  • 我们会在下周继续为您连载PHP设计模式漫谈系列文章,敬请期待。

    Statement:
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn