偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

PHP設(shè)計(jì)模式漫談之責(zé)任鏈模式

原創(chuàng)
開(kāi)發(fā) 后端 前端
51CTO將帶您繼續(xù)深入PHP設(shè)計(jì)模式,講解的行為模式是責(zé)任鏈模式,其目的是組織一個(gè)對(duì)象鏈處理一個(gè)如方法調(diào)用的請(qǐng)求。

【51CTO獨(dú)家特稿】在上期的《PHP設(shè)計(jì)模式漫談》中,我們講到了PHP的代理模式,本節(jié)我們將繼續(xù)深入PHP設(shè)計(jì)模式,講解的行為模式是責(zé)任鏈模式,其目的是組織一個(gè)對(duì)象鏈處理一個(gè)如方法調(diào)用的請(qǐng)求。

當(dāng)ConcreteHandler(具體的處理程序)不知道如何滿足來(lái)自Client的請(qǐng)求時(shí),或它的目的不是這個(gè)時(shí),它會(huì)委派給鏈中的下一個(gè)Handler(處理程序)來(lái)處理。
這個(gè)設(shè)計(jì)模式通常和復(fù)合模式一起使用,其中有些葉子或容器對(duì)象默認(rèn)委派操作給它們的父對(duì)象。另一個(gè)例子是,本地化通常是使用責(zé)任鏈處理的,當(dāng)?shù)抡Z(yǔ)翻譯適配器沒(méi)有為翻譯關(guān)鍵詞找到合適的結(jié)果時(shí),就返回到英語(yǔ)適配器或干脆直接顯示關(guān)鍵詞本身。

耦合減少到最低限度:Client類不知道由哪個(gè)具體的類來(lái)處理請(qǐng)求;在創(chuàng)建對(duì)象圖時(shí)配置了鏈;ConcreteHandlers不知道哪個(gè)對(duì)象是它們的繼承者。行為在對(duì)象之間分配是成功的,鏈中最近的對(duì)象有優(yōu)先權(quán)和責(zé)任滿足請(qǐng)求。

PHP設(shè)計(jì)模式中的責(zé)任鏈模式 
PHP設(shè)計(jì)模式中的責(zé)任鏈模式

參與者:

◆Client(客戶端):向Handler(處理程序)提交一個(gè)請(qǐng)求;

◆Handler(處理程序)抽象:接收一個(gè)請(qǐng)求,以某種方式滿足它;

◆ConcreteHandlers(具體的處理程序):接收一個(gè)請(qǐng)求,設(shè)法滿足它,如果不成功就委派給下一個(gè)處理程序。

下面的代碼實(shí)現(xiàn)了一個(gè)最著名的責(zé)任鏈?zhǔn)纠憾嗉?jí)緩存。

  1. /**  
  2.  * The Handler abstraction. Objects that want to be a part of the  
  3.  * ChainOfResponsibility must implement this interface directly or via  
  4.  * inheritance from an AbstractHandler.  
  5.  */ 
  6. interface KeyValueStore  
  7. {  
  8.     /**  
  9.      * Obtain a value.  
  10.      * @param string $key  
  11.      * @return mixed  
  12.      */ 
  13.     public function get($key);  
  14. }  
  15.  
  16. /**  
  17.  * Basic no-op implementation which ConcreteHandlers not interested in  
  18.  * caching or in interfering with the retrieval inherit from.  
  19.  */ 
  20. abstract class AbstractKeyValueStore implements KeyValueStore  
  21. {  
  22.     protected $_nextHandler;  
  23.  
  24.     public function get($key)  
  25.     {  
  26.         return $this->_nextHandler->get($key);  
  27.     }  
  28. }  
  29.  
  30. /**  
  31.  * Ideally the last ConcreteHandler in the chain. At least, if inserted in  
  32.  * a Chain it will be the last node to be called.  
  33.  */ 
  34. class SlowStore implements KeyValueStore  
  35. {  
  36.     /**  
  37.      * This could be a somewhat slow store: a database or a flat file.  
  38.      */ 
  39.     protected $_values;  
  40.  
  41.     public function __construct(array $values = array())  
  42.     {  
  43.         $this->_values = $values;  
  44.     }  
  45.  
  46.     public function get($key)  
  47.     {  
  48.         return $this->_values[$key];  
  49.     }  
  50. }  
  51.  
  52. /**  
  53.  * A ConcreteHandler that handles the request for a key by looking for it in  
  54.  * its own cache. Forwards to the next handler in case of cache miss.  
  55.  */ 
  56. class InMemoryKeyValueStore implements KeyValueStore  
  57. {  
  58.     protected $_nextHandler;  
  59.     protected $_cached = array();  
  60.  
  61.     public function __construct(KeyValueStore $nextHandler)  
  62.     {  
  63.         $this->_nextHandler = $nextHandler;  
  64.     }  
  65.  
  66.     protected function _load($key)  
  67.     {  
  68.         if (!isset($this->_cached[$key])) {  
  69.             $this->_cached[$key] = $this->_nextHandler->get($key);  
  70.         }  
  71.     }  
  72.  
  73.     public function get($key)  
  74.     {  
  75.         $this->_load($key);  
  76.         return $this->_cached[$key];  
  77.     }  
  78. }  
  79.  
  80. /**  
  81.  * A ConcreteHandler that delegates the request without trying to  
  82.  * understand it at all. It may be easier to use in the user interface  
  83.  * because it can specialize itself by defining methods that generates  
  84.  * html, or by addressing similar user interface concerns.  
  85.  * Some Clients see this object only as an instance of KeyValueStore  
  86.  * and do not care how it satisfy their requests, while other ones  
  87.  * may use it in its entirety (similar to a class-based adapter).  
  88.  * No client knows that a chain of Handlers exists.  
  89.  */ 
  90. class FrontEnd extends AbstractKeyValueStore  
  91. {  
  92.     public function __construct(KeyValueStore $nextHandler)  
  93.     {  
  94.         $this->_nextHandler = $nextHandler;  
  95.     }  
  96.  
  97.     public function getEscaped($key)  
  98.     {  
  99.         return htmlentities($this->get($key), ENT_NOQUOTES, 'UTF-8');  
  100.     }  
  101. }  
  102.  
  103. // Client code  
  104. $store = new SlowStore(array('pd' => 'Philip K. Dick',  
  105.                              'ia' => 'Isaac Asimov',  
  106.                              'ac' => 'Arthur C. Clarke',  
  107.                              'hh' => 'Helmut Heißenbüttel'));  
  108. // in development, we skip cache and pass $store directly to FrontEnd  
  109. $cache = new InMemoryKeyValueStore($store);  
  110. $frontEnd = new FrontEnd($cache);  
  111.  
  112. echo $frontEnd->get('ia'), "\n";  
  113. echo $frontEnd->getEscaped('hh'), "\n"

關(guān)于PHP責(zé)任鏈設(shè)計(jì)模式的一些實(shí)現(xiàn)說(shuō)明:

◆責(zé)任鏈可能已經(jīng)存在于對(duì)象圖中,和復(fù)合模式的例子一樣;

◆此外,Handler抽象可能存在,也可能不存在,最好的選擇是一個(gè)分開(kāi)的Handler接口只可以執(zhí)行handleRequest()操作,不要強(qiáng)制一個(gè)鏈只在一個(gè)層次中,因?yàn)楹竺娴囊呀?jīng)存在了;

◆也可能引入一個(gè)抽象類,但由于請(qǐng)求處理是一個(gè)正交關(guān)注,因此具體的類可能已經(jīng)繼承了其它類;

◆通過(guò)constructor 或setter,Handler(或下一個(gè)Handler)被注入到Client或前一個(gè)Handler;

◆請(qǐng)求對(duì)象通常是一個(gè)ValueObject,也可能被實(shí)現(xiàn)為一個(gè)Flyweight,在PHP中,它可能是一個(gè)標(biāo)量類型,如string,注意在某些語(yǔ)言中,一個(gè)string就是一個(gè)不變的ValueObject。

簡(jiǎn)單的總結(jié)責(zé)任鏈模式,可以歸納為:用一系列類(classes)試圖處理一個(gè)請(qǐng)求request,這些類之間是一個(gè)松散的耦合,唯一共同點(diǎn)是在他們之間傳遞request. 也就是說(shuō),來(lái)了一個(gè)請(qǐng)求,A類先處理,如果沒(méi)有處理,就傳遞到B類處理,如果沒(méi)有處理,就傳遞到C類處理,就這樣象一個(gè)鏈條(chain)一樣傳遞下去。

51CTO會(huì)在下周繼續(xù)深入PHP設(shè)計(jì)模式,講解PHP中的結(jié)構(gòu)化模式摘要,敬請(qǐng)關(guān)注。

【編輯推薦】

  1. PHP設(shè)計(jì)模式漫談之代理模式
  2. 使用設(shè)計(jì)模式改善程序結(jié)構(gòu)
  3. 架構(gòu)、框架、設(shè)計(jì)模式之間的關(guān)系簡(jiǎn)述
  4. 鐘勝輝談PHP發(fā)展的現(xiàn)狀和前景
  5. 揭示PHP成功背后的秘密:PHP創(chuàng)始人訪談錄 

原文:Practical Php Patterns: Chain of Responsibility    作者:Giorgio

鏈接:http://giorgiosironi.blogspot.com/2010/02/practical-php-patterns-chain-of.html

 

責(zé)任編輯:佚名 來(lái)源: 51CTO.com
相關(guān)推薦

2021-12-24 07:50:45

責(zé)任鏈模式設(shè)計(jì)

2010-04-13 08:54:28

PHP設(shè)計(jì)模式命令模式

2010-03-25 08:52:30

PHP設(shè)計(jì)模式代理模式

2010-04-19 09:30:00

工廠模式PHP設(shè)計(jì)模式

2010-04-29 08:53:11

PHP迭代器模式

2010-04-08 09:27:04

PHP設(shè)計(jì)模式結(jié)構(gòu)模式

2010-04-21 08:38:18

解釋器模式PHP設(shè)計(jì)模式

2010-05-06 08:44:37

調(diào)解者模式

2012-03-28 13:28:56

Java設(shè)計(jì)模式

2023-06-05 07:55:31

2024-01-30 13:15:00

設(shè)計(jì)模式責(zé)任鏈

2020-11-17 09:32:57

設(shè)計(jì)模式責(zé)任鏈

2023-09-26 00:27:07

設(shè)計(jì)模式鏈接

2022-12-28 08:08:57

2021-08-14 08:17:49

Android設(shè)計(jì)模式OKHttp

2022-11-01 08:46:20

責(zé)任鏈模式對(duì)象

2024-05-09 12:17:00

責(zé)任鏈設(shè)計(jì)模式

2024-06-04 13:11:52

Python行為設(shè)計(jì)模式開(kāi)發(fā)

2024-12-03 15:52:45

責(zé)任鏈Java

2021-07-14 10:08:30

責(zé)任鏈模式加工鏈
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)