<table cellspacing="0" cellpadding="0"><tr> <td class="t_f" id="postmessage_23865"> 多層級快取責任鏈模式。 <br> * client提交給hander,hander發現責任鏈上能處理該任務的函數,處理;可以歸納為:用一系列類(classes)試圖處理一個請求request,這些類別之間是一個鬆散的耦合,唯一共同點是在他們之間傳遞request. 也就是說,來了一個請求,A類先處理,如果沒有處理,就傳遞到B類處理,如果沒有處理,就傳遞到C類處理,就這樣象一個鏈條(chain)一樣傳遞下去。 <br><div class="blockcode"> <div id="code_L67"><ol> <li><?php <li></li> <li>/**</li> <li> * 責任鏈模式,其目的是組織一個物件鏈處理一個如方法呼叫的請求。 </li> <li> * </li> <li> * 最著名的責任鏈範例:多層快取。 </li> <li> * client提交給hander,hander發現責任鏈上能處理該任務的函數,處理;</li> <li> * 可以歸納為:用一系列類別(classes)試圖處理一個請求request,這些類別之間是一個鬆散的耦合,</li> <li> * 唯一共同點是在他們之間傳遞request. 也就是說,來了一個請求,A類先處理,如果沒有處理,</li> <li> * 就傳遞到B類處理,如果沒有處理,就傳遞到C類處理,就這樣像一個鏈條(chain)一樣傳遞下去。 </li> <li>*/</li> <li> </li> <li> </li> <li>/**</li> <li>* The Handler abstraction. Objects that want to be a part of the</li> <li>* ChainOfResponsibility must implement this interface directly or via</li> <li>* inheritance from an AbstractHandler.* 繼承一個抽象的處理類別</li> <li>介面/</li> <li>介面KeyValueStore{</li> <li> /**</li> <li> * 取得一個值。 </li> <li> * @param string $key</li> <li> * @return mix</li> <li>*/</li> <li> public function get($key);</li> <li>}</li> <li>/**</li> <li>* Basic no-op implementation which ConcreteHandlers not interested in</li> <li>* caching or in interfering with the retrieval inherit from.</li> <li>* 接收一個請求,設法滿足它,如果不成功就派給下一個處理程序。 </li> <li>*/</li> <li>抽象類別AbstractKeyValueStore 實作KeyValueStore{</li> <li> protected $_nextHandler;</li> <li> public function get($key){</li> <li> return $this->_nextHandler->get($key);</li> <li> }</li> <li>}</li> <li>/** </li> <li>* Ideally the last ConcreteHandler in the chain. At least, if inserted in</li> <li>* a Chain it will be the last node to be called.</li> <li>* 理想情況下,責任鏈上最後的具體處理類,加入鏈上,將是最後被呼叫的節點。 </li> <li> */</li> <li>class SlowStore 實作KeyValueStore{</li> <li> /**</li> <li> * 這可能是一個有點慢的儲存:資料庫或平面檔案。 </li> <li>*/</li> <li> protected $_values;</li> <li> public function __construct(array $values = array()){</li> <li> $-this-this- >_values = $values;</li> <li> }</li> <li> public function get($key){</li> <li> return $this->_values[$key];</li> <li> }</li> <li>}</li> <li>/**</li> <li>* A ConcreteHandler that handles the request for a key by looking for it in</li> <li>* its own cache. Forwards to the next handler in case of cache miss.</li> <li>* 在緩存沒命中的情況下,轉發到下一個處理對象</li> <li>*/</li> <li>類別InMemoryKeyValueStore 實作KeyValueStore{</li> <li> protected $_nextHandler;</li> <li> protected $_cached = array();</li> <li> public function __construct(KeyValueore $nextdler. = $nextHandler;</li> <li> }</li> <li> 受保護函數_load($key){</li> <li> if (!isset($this->_cached[$key])) {</li> <li> $ this->_cached[ $key ] = $this->_nextHandler->get($key);</li> <li> }</li> <li> }</li> <li> public function get($key){</li> <li> $this->_load($key);</li> <li> return $this->_cached[$key];</li> <li> }</li> <li>}</li> <li>/**</li> <li>* 一個ConcreteHandler,它委託請求嘗試而無需</li> <li>*完全明白。容易在使用者介面中使用</li> <li>*,因為它可以透過定義產生</li> <li>* html 的方法或透過解決類似的使用者介面問題來專門化自己。 KeyValueStore </li> <li>* 的實例,不介意它如何滿足他們的請求,而其他</li> <li>* 可能會完全使用它(類似於基於類別的玩具)。關心呼籲的具體實現的外部具體具體處理程序;背後是責任鏈。</li> <li>*/</li> <li>class FrontEnd extends AbstractKeyValueStore{</li> <li> public function __construct(KeyValueStore $nextHandler){</li> <li> $this->_nextHandler = $nextHandler;</li> <li> } return htmlentities($this->get($key), ENT_NOQUOTES, 'UTF-8');</li> <li> }</li> <li>}</li> <li>// 客戶端程式碼</li> <li>$store = new SlowStore(</li> <li> array(</li> <li> 'pd' => 'Philip K. Dick',</li> <li> 'ia' => '艾薩克·阿西莫夫',</li> <li> 'ac' => ' Arthur C . Clarke',</li> <li> 'hh' => 'Helmut Hei.enbttel'</li> <li> )</li> <li>);</li> <li>// 在開發中,我們跳過快取並將$store 直接傳給FrontEnd</li> <li>$ cache = new InMemoryKeyValueStore($store);</li> <li>$frontEnd = new FrontEnd($cache);</li> <li>echo $frontEnd->get('ia'). "n";</li> <li>echo $frontEnd->getEscaped('hh'). "n";</li> <li> <li>/**</li> <li> * expect: ...</li> <li> * Isaac Asimov</li> <li> * Helmut Hei.enbttel</li> <li> * </li> <li> * 參與者:</li> <li> <li>◆Client(客戶端):向Handler(處理程序)提交一個請求;</li> <li>◆Handler(處理程序)抽象:接收一個請求,以某種方式滿足它;</li> <li>◆ConcreteHandlers(具體的處理程序):接收一個請求,設法滿足它,如果不成功就委派給下一個處理程序。 </li> <li>*/</li> <li> <li> </ol></div>複製程式碼<em onclick="copycode($('code_L67'));"></em> </div> </td>複製程式碼</tr></table> <div id="comment_23865" class="cm"></div> <div id="post_rate_div_23865"> </div> <br> <br>