這個(gè)設(shè)計(jì)模式 " /> 桃色园社区,国产成人啪精视频精东传媒网站,欧美黑人巨大videos免费

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP設(shè)計(jì)模式之責(zé)任鏈模式的深入解析

責(zé)任鏈模式,其目的是組織一個(gè)對(duì)象鏈處理一個(gè)如方法調(diào)用的請(qǐng)求。
當(dāng)ConcreteHandler(具體的處理程序)不知道如何滿足來自Client的請(qǐng)求時(shí),或它的目的不是這個(gè)時(shí),它會(huì)委派給鏈中的下一個(gè)Handler(處理程序)來處理。

這個(gè)設(shè)計(jì)模式通常和復(fù)合模式一起使用,其中有些葉子或容器對(duì)象默認(rèn)委派操作給它們的父對(duì)象。另一個(gè)例子是,本地化通常是使用責(zé)任鏈處理的,當(dāng)?shù)抡Z翻譯適配器沒有為翻譯關(guān)鍵詞找到合適的結(jié)果時(shí),就返回到英語適配器或干脆直接顯示關(guān)鍵詞本身。

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

參與者:
◆Client(客戶端):向Handler(處理程序)提交一個(gè)請(qǐng)求;
◆Handler(處理程序)抽象:接收一個(gè)請(qǐng)求,以某種方式滿足它;
◆ConcreteHandlers(具體的處理程序):接收一個(gè)請(qǐng)求,設(shè)法滿足它,如果不成功就委派給下一個(gè)處理程序。
下面的代碼實(shí)現(xiàn)了一個(gè)最著名的責(zé)任鏈?zhǔn)纠憾嗉?jí)緩存。
復(fù)制代碼 代碼如下:
/** 
 * The Handler abstraction. Objects that want to be a part of the 
 * ChainOfResponsibility must implement this interface directly or via 
 * inheritance from an AbstractHandler. 
 */
interface KeyValueStore 

    /** 
     * Obtain a value. 
     * @param string $key 
     * @return mixed 
     */
    public function get($key); 


/** 
 * Basic no-op implementation which ConcreteHandlers not interested in 
 * caching or in interfering with the retrieval inherit from. 
 */
abstract class AbstractKeyValueStore implements KeyValueStore 

    protected $_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 $_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 $_nextHandler; 
    protected $_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";

關(guān)于php責(zé)任鏈設(shè)計(jì)模式的一些實(shí)現(xiàn)說明:
◆責(zé)任鏈可能已經(jīng)存在于對(duì)象圖中,和復(fù)合模式的例子一樣;
◆此外,Handler抽象可能存在,也可能不存在,最好的選擇是一個(gè)分開的Handler接口只可以執(zhí)行handleRequest()操作,不要強(qiáng)制一個(gè)鏈只在一個(gè)層次中,因?yàn)楹竺娴囊呀?jīng)存在了;
◆也可能引入一個(gè)抽象類,但由于請(qǐng)求處理是一個(gè)正交關(guān)注,因此具體的類可能已經(jīng)繼承了其它類;
◆通過constructor 或setter,Handler(或下一個(gè)Handler)被注入到Client或前一個(gè)Handler;
◆請(qǐng)求對(duì)象通常是一個(gè)ValueObject,也可能被實(shí)現(xiàn)為一個(gè)Flyweight,在php中,它可能是一個(gè)標(biāo)量類型,如string,注意在某些語言中,一個(gè)string就是一個(gè)不變的ValueObject。

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

php技術(shù)PHP設(shè)計(jì)模式之責(zé)任鏈模式的深入解析,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 色网址在线观看 | 极品美女穴 | 国产露脸A片国语露对白 | 狠狠色狠狠色88综合日日91 | 夜色福利院在线观看免费 | 99久久蜜臀亚洲AV无码精品 | 欧美精品专区第1页 | 国产人妻精品无码AV在线五十路 | 美女被男人撕衣舔胸 | 动漫在线观看免费肉肉 | 国产精品欧美亚洲 | 亚洲AV午夜福利精品香蕉麻豆 | 日产2021免费一二三四区在线 | 国产偷国产偷亚洲高清app | 亚洲一区免费在线观看 | 夜色女人香 | 思思re热免费精品视频66 | 囯产愉拍亚洲精品一区 | 日韩免费视频一区 | 国产精品无码AV天天爽人妻蜜桃 | 久久www免费人成_看片高清 | 国产欧洲野花A级 | 国产欧美无码亚洲 | 年轻的母亲4线在线观看完整 | 亚洲色播永久网址大全 | 国产av在在免费线观看美女 | 哇嘎在线精品视频在线观看 | 伦理片天堂eeuss影院 | 午夜理论电影在线观看亚洲 | 日韩欧美精品有码在线播放 | 一个人在线观看视频免费 | 中文字幕 人妻熟女 | 嘴巴舔着她的私处插 | 电影内射视频免费观看 | 97在线播放 | 无码丰满人妻熟妇区 | 无套内射无矿码免费看黄 | 欧美一级情欲片在线 | 小小水蜜桃视频高清在线观看免费 | 色欲国产麻豆精品AV免费 | 香蕉在线播放 |