Maison >développement back-end >tutoriel php >PHP设计模式漫谈之责任链模式_PHP

PHP设计模式漫谈之责任链模式_PHP

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

在上期的《PHP设计模式漫谈》中,我们讲到了PHP的代理模式,本节我们将继续深入PHP设计模式,讲解的行为模式是责任链模式,其目的是组织一个对象链处理一个如方法调用的请求。

当ConcreteHandler(具体的处理程序)不知道如何满足来自Client的请求时,或它的目的不是这个时,它会委派给链中的下一个Handler(处理程序)来处理。
这个设计模式通常和复合模式一起使用,其中有些叶子或容器对象默认委派操作给它们的父对象。另一个例子是,本地化通常是使用责任链处理的,当德语翻译适配器没有为翻译关键词找到合适的结果时,就返回到英语适配器或干脆直接显示关键词本身。

耦合减少到最低限度:Client类不知道由哪个具体的类来处理请求;在创建对象图时配置了链;ConcreteHandlers不知道哪个对象是它们的继承者。行为在对象之间分配是成功的,链中最近的对象有优先权和责任满足请求。

PHP设计模式中的责任链模式 
PHP设计模式中的责任链模式

参与者:

◆Client(客户端):向Handler(处理程序)提交一个请求;

◆Handler(处理程序)抽象:接收一个请求,以某种方式满足它;

◆ConcreteHandlers(具体的处理程序):接收一个请求,设法满足它,如果不成功就委派给下一个处理程序。

下面的代码实现了一个最著名的责任链示例:多级缓存。

<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"> * The Handler abstraction. Objects that want to be a part of the </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> * ChainOfResponsibility must implement this interface directly or via </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> * inheritance from an AbstractHandler. </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> KeyValueStore  </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">     * Obtain a value. </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200">     * @param string $key </font></span> </span></li>
<li><span><span class="comment"><font color="#008200">     * @return mixed </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> get(</span><span class="vars"><font color="#dd0000">$key</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"> * Basic no-op implementation which ConcreteHandlers not interested in </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> * caching or in interfering with the retrieval inherit from. </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">abstract</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span> AbstractKeyValueStore </span><span class="keyword"><strong><font color="#006699">implements</font></strong></span><span> KeyValueStore  </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">在上期的《<font color="#0000ff">PHP设计模式漫谈</font>》中,我们讲到了<font color="#0000ff">PHP的代理模式</font>,本节我们将继续深入PHP设计模式,讲解的行为模式是责任链模式,其目的是组织一个对象链处理一个如方法调用的请求。
<p>当ConcreteHandler(具体的处理程序)不知道如何满足来自Client的请求时,或它的目的不是这个时,它会委派给链中的下一个Handler(处理程序)来处理。<br>这个设计模式通常和复合模式一起使用,其中有些叶子或容器对象默认委派操作给它们的父对象。另一个例子是,本地化通常是使用责任链处理的,当德语翻译适配器没有为翻译关键词找到合适的结果时,就返回到英语适配器或干脆直接显示关键词本身。</p>
<p>耦合减少到最低限度:Client类不知道由哪个具体的类来处理请求;在创建对象图时配置了链;ConcreteHandlers不知道哪个对象是它们的继承者。行为在对象之间分配是成功的,链中最近的对象有优先权和责任满足请求。</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/100506/1412043133-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><strong>参与者:</strong></p>
<p>◆Client(客户端):向Handler(处理程序)提交一个请求;</p>
<p>◆Handler(处理程序)抽象:接收一个请求,以某种方式满足它;</p>
<p>◆ConcreteHandlers(具体的处理程序):接收一个请求,设法满足它,如果不成功就委派给下一个处理程序。</p>
<p>下面的代码实现了一个最著名的责任链示例:多级缓存。</p>
<pre class="brush:php;toolbar:false">___FCKpd___0

关于PHP责任链设计模式的一些实现说明:

◆责任链可能已经存在于对象图中,和复合模式的例子一样;

◆此外,Handler抽象可能存在,也可能不存在,最好的选择是一个分开的Handler接口只可以执行handleRequest()操作,不要强制一个链只在一个层次中,因为后面的已经存在了;

◆也可能引入一个抽象类,但由于请求处理是一个正交关注,因此具体的类可能已经继承了其它类;

◆通过constructor 或setter,Handler(或下一个Handler)被注入到Client或前一个Handler;

◆请求对象通常是一个ValueObject,也可能被实现为一个Flyweight,在PHP中,它可能是一个标量类型,如string,注意在某些语言中,一个string就是一个不变的ValueObject。

简单的总结责任链模式,可以归纳为:用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

bitscn会在下周继续深入PHP设计模式,讲解PHP中的结构化模式摘要,敬请关注。

nextHandler;  
  •  
  •     public function get($key)  
  •     {  
  •         return $this->_nextHandler->get($key);  
  •     }  
  • }  
  •  
  • /**  
  •  * Ideally the last ConcreteHandler in the chain. At least, if inserted in  
  •  * a Chain it will be the last node to be called.  
  •  */ 
  • class SlowStore implements KeyValueStore  
  • {  
  •     /**  
  •      * This could be a somewhat slow store: a database or a flat file.  
  •      */ 
  •     protected 在上期的《PHP设计模式漫谈》中,我们讲到了PHP的代理模式,本节我们将继续深入PHP设计模式,讲解的行为模式是责任链模式,其目的是组织一个对象链处理一个如方法调用的请求。

    当ConcreteHandler(具体的处理程序)不知道如何满足来自Client的请求时,或它的目的不是这个时,它会委派给链中的下一个Handler(处理程序)来处理。
    这个设计模式通常和复合模式一起使用,其中有些叶子或容器对象默认委派操作给它们的父对象。另一个例子是,本地化通常是使用责任链处理的,当德语翻译适配器没有为翻译关键词找到合适的结果时,就返回到英语适配器或干脆直接显示关键词本身。

    耦合减少到最低限度:Client类不知道由哪个具体的类来处理请求;在创建对象图时配置了链;ConcreteHandlers不知道哪个对象是它们的继承者。行为在对象之间分配是成功的,链中最近的对象有优先权和责任满足请求。

    PHP设计模式中的责任链模式 
    PHP设计模式中的责任链模式

    参与者:

    ◆Client(客户端):向Handler(处理程序)提交一个请求;

    ◆Handler(处理程序)抽象:接收一个请求,以某种方式满足它;

    ◆ConcreteHandlers(具体的处理程序):接收一个请求,设法满足它,如果不成功就委派给下一个处理程序。

    下面的代码实现了一个最著名的责任链示例:多级缓存。

    ___FCKpd___0

    关于PHP责任链设计模式的一些实现说明:

    ◆责任链可能已经存在于对象图中,和复合模式的例子一样;

    ◆此外,Handler抽象可能存在,也可能不存在,最好的选择是一个分开的Handler接口只可以执行handleRequest()操作,不要强制一个链只在一个层次中,因为后面的已经存在了;

    ◆也可能引入一个抽象类,但由于请求处理是一个正交关注,因此具体的类可能已经继承了其它类;

    ◆通过constructor 或setter,Handler(或下一个Handler)被注入到Client或前一个Handler;

    ◆请求对象通常是一个ValueObject,也可能被实现为一个Flyweight,在PHP中,它可能是一个标量类型,如string,注意在某些语言中,一个string就是一个不变的ValueObject。

    简单的总结责任链模式,可以归纳为:用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

    bitscn会在下周继续深入PHP设计模式,讲解PHP中的结构化模式摘要,敬请关注。

    values
    ;  
  •  
  •     public function __construct(array $values = array())  
  •     {  
  •         $this->_values = $values;  
  •     }  
  •  
  •     public function get($key)  
  •     {  
  •         return $this->_values[$key];  
  •     }  
  • }  
  •  
  • /**  
  •  * A ConcreteHandler that handles the request for a key by looking for it in  
  •  * its own cache. Forwards to the next handler in case of cache miss.  
  •  */ 
  • class InMemoryKeyValueStore implements KeyValueStore  
  • {  
  •     protected 在上期的《PHP设计模式漫谈》中,我们讲到了PHP的代理模式,本节我们将继续深入PHP设计模式,讲解的行为模式是责任链模式,其目的是组织一个对象链处理一个如方法调用的请求。

    当ConcreteHandler(具体的处理程序)不知道如何满足来自Client的请求时,或它的目的不是这个时,它会委派给链中的下一个Handler(处理程序)来处理。
    这个设计模式通常和复合模式一起使用,其中有些叶子或容器对象默认委派操作给它们的父对象。另一个例子是,本地化通常是使用责任链处理的,当德语翻译适配器没有为翻译关键词找到合适的结果时,就返回到英语适配器或干脆直接显示关键词本身。

    耦合减少到最低限度:Client类不知道由哪个具体的类来处理请求;在创建对象图时配置了链;ConcreteHandlers不知道哪个对象是它们的继承者。行为在对象之间分配是成功的,链中最近的对象有优先权和责任满足请求。

    PHP设计模式中的责任链模式 
    PHP设计模式中的责任链模式

    参与者:

    ◆Client(客户端):向Handler(处理程序)提交一个请求;

    ◆Handler(处理程序)抽象:接收一个请求,以某种方式满足它;

    ◆ConcreteHandlers(具体的处理程序):接收一个请求,设法满足它,如果不成功就委派给下一个处理程序。

    下面的代码实现了一个最著名的责任链示例:多级缓存。

    ___FCKpd___0

    关于PHP责任链设计模式的一些实现说明:

    ◆责任链可能已经存在于对象图中,和复合模式的例子一样;

    ◆此外,Handler抽象可能存在,也可能不存在,最好的选择是一个分开的Handler接口只可以执行handleRequest()操作,不要强制一个链只在一个层次中,因为后面的已经存在了;

    ◆也可能引入一个抽象类,但由于请求处理是一个正交关注,因此具体的类可能已经继承了其它类;

    ◆通过constructor 或setter,Handler(或下一个Handler)被注入到Client或前一个Handler;

    ◆请求对象通常是一个ValueObject,也可能被实现为一个Flyweight,在PHP中,它可能是一个标量类型,如string,注意在某些语言中,一个string就是一个不变的ValueObject。

    简单的总结责任链模式,可以归纳为:用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

    bitscn会在下周继续深入PHP设计模式,讲解PHP中的结构化模式摘要,敬请关注。

    nextHandler
    ;  
  •     protected 在上期的《PHP设计模式漫谈》中,我们讲到了PHP的代理模式,本节我们将继续深入PHP设计模式,讲解的行为模式是责任链模式,其目的是组织一个对象链处理一个如方法调用的请求。

    当ConcreteHandler(具体的处理程序)不知道如何满足来自Client的请求时,或它的目的不是这个时,它会委派给链中的下一个Handler(处理程序)来处理。
    这个设计模式通常和复合模式一起使用,其中有些叶子或容器对象默认委派操作给它们的父对象。另一个例子是,本地化通常是使用责任链处理的,当德语翻译适配器没有为翻译关键词找到合适的结果时,就返回到英语适配器或干脆直接显示关键词本身。

    耦合减少到最低限度:Client类不知道由哪个具体的类来处理请求;在创建对象图时配置了链;ConcreteHandlers不知道哪个对象是它们的继承者。行为在对象之间分配是成功的,链中最近的对象有优先权和责任满足请求。

    PHP设计模式中的责任链模式 
    PHP设计模式中的责任链模式

    参与者:

    ◆Client(客户端):向Handler(处理程序)提交一个请求;

    ◆Handler(处理程序)抽象:接收一个请求,以某种方式满足它;

    ◆ConcreteHandlers(具体的处理程序):接收一个请求,设法满足它,如果不成功就委派给下一个处理程序。

    下面的代码实现了一个最著名的责任链示例:多级缓存。

    ___FCKpd___0

    关于PHP责任链设计模式的一些实现说明:

    ◆责任链可能已经存在于对象图中,和复合模式的例子一样;

    ◆此外,Handler抽象可能存在,也可能不存在,最好的选择是一个分开的Handler接口只可以执行handleRequest()操作,不要强制一个链只在一个层次中,因为后面的已经存在了;

    ◆也可能引入一个抽象类,但由于请求处理是一个正交关注,因此具体的类可能已经继承了其它类;

    ◆通过constructor 或setter,Handler(或下一个Handler)被注入到Client或前一个Handler;

    ◆请求对象通常是一个ValueObject,也可能被实现为一个Flyweight,在PHP中,它可能是一个标量类型,如string,注意在某些语言中,一个string就是一个不变的ValueObject。

    简单的总结责任链模式,可以归纳为:用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

    bitscn会在下周继续深入PHP设计模式,讲解PHP中的结构化模式摘要,敬请关注。

    cached
     = array();  
  •  
  •     public function __construct(KeyValueStore $nextHandler)  
  •     {  
  •         $this->_nextHandler = $nextHandler;  
  •     }  
  •  
  •     protected function _load($key)  
  •     {  
  •         if (!isset($this->_cached[$key])) {  
  •             $this->_cached[$key] = $this->_nextHandler->get($key);  
  •         }  
  •     }  
  •  
  •     public function get($key)  
  •     {  
  •         $this->_load($key);  
  •         return $this->_cached[$key];  
  •     }  
  • }  
  •  
  • /**  
  •  * A ConcreteHandler that delegates the request without trying to  
  •  * understand it at all. It may be easier to use in the user interface  
  •  * because it can specialize itself by defining methods that generates  
  •  * html, or by addressing similar user interface concerns.  
  •  * Some Clients see this object only as an instance of KeyValueStore  
  •  * and do not care how it satisfy their requests, while other ones  
  •  * may use it in its entirety (similar to a class-based adapter).  
  •  * No client knows that a chain of Handlers exists.  
  •  */ 
  • class FrontEnd extends AbstractKeyValueStore  
  • {  
  •     public function __construct(KeyValueStore $nextHandler)  
  •     {  
  •         $this->_nextHandler = $nextHandler;  
  •     }  
  •  
  •     public function getEscaped($key)  
  •     {  
  •         return htmlentities($this->get($key), ENT_NOQUOTES, 'UTF-8');  
  •     }  
  • }  
  •  
  • // Client code  
  • $store = new SlowStore(array('pd' => 'Philip K. Dick',  
  •                              'ia' => 'Isaac Asimov',  
  •                              'ac' => 'Arthur C. Clarke',  
  •                              'hh' => 'Helmut Heißenbüttel'));  
  • // in development, we skip cache and pass $store directly to FrontEnd  
  • $cache = new InMemoryKeyValueStore($store);  
  • $frontEnd = new FrontEnd($cache);  
  •  
  • echo $frontEnd->get('ia'), "\n";  
  • echo $frontEnd->getEscaped('hh'), "\n"
  • 关于PHP责任链设计模式的一些实现说明:

    ◆责任链可能已经存在于对象图中,和复合模式的例子一样;

    ◆此外,Handler抽象可能存在,也可能不存在,最好的选择是一个分开的Handler接口只可以执行handleRequest()操作,不要强制一个链只在一个层次中,因为后面的已经存在了;

    ◆也可能引入一个抽象类,但由于请求处理是一个正交关注,因此具体的类可能已经继承了其它类;

    ◆通过constructor 或setter,Handler(或下一个Handler)被注入到Client或前一个Handler;

    ◆请求对象通常是一个ValueObject,也可能被实现为一个Flyweight,在PHP中,它可能是一个标量类型,如string,注意在某些语言中,一个string就是一个不变的ValueObject。

    简单的总结责任链模式,可以归纳为:用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

    bitscn会在下周继续深入PHP设计模式,讲解PHP中的结构化模式摘要,敬请关注。

    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