Maison  >  Article  >  développement back-end  >  PHP设计模式漫谈之命令模式_PHP

PHP设计模式漫谈之命令模式_PHP

WBOY
WBOYoriginal
2016-06-01 12:20:33823parcourir

PHP设计模式漫谈我们已经连载了四期,我们知道了代理模式、责任链模式和结构模式;今天我们一起来讨论的是命令模式(Command),命令模式是封装一个通用操作的机制。

如果你熟悉C或PHP,你可能已经遇到过Command,它相当于程序中的:回调(callback)。回调通常使用一个函数指针或数据结构如PHP中的字符串和数组实现,Command是在一个方法调用之上的抽象,它吸收了所有面向对象的好处:合成、继承和处理。

例如,《设计模式》一书推荐使用Command存储用户行为链,以支持撤销和重做操作。

注意PHP 5.3函数编程能力(闭包)可以被当做Command模式的一个本地实现,但为每一个命令层次结构使用抽象数据类型有助于类型安全。

PHP设计模式中的命令模式 
PHP设计模式中的命令模式

在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。

参与者:

◆Command(命令):在一个方法调用之上定义一个抽象;

◆ConcreteCommand(具体的命令):一个操作的实现;

◆Invoker(调用者):引用Command实例作为它可用的操作。

下面的代码展示了Validator组件作为Command对象实现的示例:

<ol class="dp-c">
<li class="alt"><span><span><?php  </span></span></span></li>
<li>
<span class="comment"><font color="#008200">/** </font></span> </li>
<li class="alt"><span><span class="comment"><font color="#008200"> * The Command abstraction. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> * In this case the implementation must return a result, </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> * sometimes it only has side effects. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li class="alt">
<span class="keyword"><strong><font color="#006699">interface</font></strong></span><span> Validator  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment"><font color="#008200">/** </font></span> </li>
<li><span><span class="comment"><font color="#008200">     * The method could have any parameters. </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200">     * @param mixed </font></span> </span></li>
<li><span><span class="comment"><font color="#008200">     * @return boolean </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> isValid(</span><span class="vars"><font color="#dd0000">$value</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"> * ConcreteCommand. </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> MoreThanZeroValidator </span><span class="keyword"><strong><font color="#006699">implements</font></strong></span><span> Validator  </span>
</li>
<li class="alt"><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> isValid(</span><span class="vars"><font color="#dd0000">$value</font></span><span>)  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li>
<span>        </span><span class="keyword"><strong><font color="#006699">return</font></strong></span><span> </span><span class="vars"><font color="#dd0000">$value</font></span><span> > 0;  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span class="comment"><font color="#008200">/** </font></span> </li>
<li class="alt"><span><span class="comment"><font color="#008200"> * ConcreteCommand. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li class="alt">
<span class="keyword"><strong><font color="#006699">class</font></strong></span><span> EvenValidator </span><span class="keyword"><strong><font color="#006699">implements</font></strong></span><span> Validator  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<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> isValid(</span><span class="vars"><font color="#dd0000">$value</font></span><span>)  </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="keyword"><strong><font color="#006699">return</font></strong></span><span> </span><span class="vars"><font color="#dd0000">$value</font></span><span> % 2 == 0;  </span>
</li>
<li><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"> * The Invoker. An implementation could store more than one </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> * Validator if needed. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li class="alt">
<span class="keyword"><strong><font color="#006699">class</font></strong></span><span> ArrayProcessor  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword"><strong><font color="#006699">protected</font></strong></span><span> </span><span class="vars"><font color="#dd0000">PHP设计模式漫谈我们已经连载了四期,我们知道了代理模式、责任链模式和<font color="#0000ff">结构模式</font>;今天我们一起来讨论的是命令模式(Command),命令模式是封装一个通用操作的机制。
<p>如果你熟悉C或PHP,你可能已经遇到过Command,它相当于程序中的:回调(callback)。回调通常使用一个函数指针或数据结构如PHP中的字符串和数组实现,Command是在一个方法调用之上的抽象,它吸收了所有面向对象的好处:合成、继承和处理。</p>
<p>例如,《设计模式》一书推荐使用Command存储用户行为链,以支持撤销和重做操作。</p>
<p>注意PHP 5.3函数编程能力(闭包)可以被当做Command模式的一个本地实现,但为每一个命令层次结构使用抽象数据类型有助于类型安全。</p>
<p style="TEXT-ALIGN: center"><img class="fit-image" onmousewheel="javascript:return big(this)"   style="max-width:90%"  style="max-width:90%" alt="PHP设计模式中的命令模式" src="http://img.bitscn.com/upimg/allimg/100413/115P52291-0.jpg"  style="max-width:90%" onload="javascript:if(this.width>498)this.style.width=498;" border="0"> <br><strong><span style="FONT-SIZE: smaller"><font size="2">PHP设计模式中的命令模式</font></span></strong></p>
<p>在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。</p>
<p><strong>参与者:</strong></p>
<p>◆Command(命令):在一个方法调用之上定义一个抽象;</p>
<p>◆ConcreteCommand(具体的命令):一个操作的实现;</p>
<p>◆Invoker(调用者):引用Command实例作为它可用的操作。</p>
<p>下面的代码展示了Validator组件作为Command对象实现的示例:</p>
<pre class="brush:php;toolbar:false">___FCKpd___0

使用PHP设计模式中的命令模式的一些注意事项:

◆方法调用中的某些参数可以在构造ConcreteCommand时提供,有效地局部套用(currying)原始函数;

◆一个Command可以被看作是一个非常简单的只有一个方法的策略(Strategy),重点放在对象的操作上;

◆ConcreteCommands也要组织它们需要的每一个资源,以实现它们的目标,主要是行为的Receiver(接受者),它们调用方法执行一个Command;

◆复合模式,装饰模式和其它模式都可以和命令模式组合,获得更多的Command,装饰Command等等。

rule;  
  •  
  •     public function __construct (Validator $rule)  
  •     {  
  •         $this->_rule = $rule;  
  •     }  
  •  
  •     public function process(array $numbers)  
  •     {  
  •         foreach ($numbers as $n) {  
  •             if ($this->_rule->IsValid($n)) {  
  •                 echo $n"\n";  
  •             }  
  •         }  
  •     }  
  • }  
  •  
  • // Client code  
  • $processor = new ArrayProcessor(new EvenValidator());  
  • $processor->process(array(1, 20, 18, 5, 0, 31, 42)); 
  • 使用PHP设计模式中的命令模式的一些注意事项:

    ◆方法调用中的某些参数可以在构造ConcreteCommand时提供,有效地局部套用(currying)原始函数;

    ◆一个Command可以被看作是一个非常简单的只有一个方法的策略(Strategy),重点放在对象的操作上;

    ◆ConcreteCommands也要组织它们需要的每一个资源,以实现它们的目标,主要是行为的Receiver(接受者),它们调用方法执行一个Command;

    ◆复合模式,装饰模式和其它模式都可以和命令模式组合,获得更多的Command,装饰Command等等。

    Déclaration:
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn