国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP設計模式之責任鏈模式的深入解析

2024-05-04 23:09:30
字體:
來源:轉載
供稿:網友
責任鏈模式,其目的是組織一個對象鏈處理一個如方法調用的請求。
當ConcreteHandler(具體的處理程序)不知道如何滿足來自Client的請求時,或它的目的不是這個時,它會委派給鏈中的下一個Handler(處理程序)來處理。

這個設計模式通常和復合模式一起使用,其中有些葉子或容器對象默認委派操作給它們的父對象。另一個例子是,本地化通常是使用責任鏈處理的,當德語翻譯適配器沒有為翻譯關鍵詞找到合適的結果時,就返回到英語適配器或干脆直接顯示關鍵詞本身。

耦合減少到最低限度:Client類不知道由哪個具體的類來處理請求;在創建對象圖時配置了鏈;ConcreteHandlers不知道哪個對象是它們的繼承者。行為在對象之間分配是成功的,鏈中最近的對象有優先權和責任滿足請求。

參與者:
◆Client(客戶端):向Handler(處理程序)提交一個請求;
◆Handler(處理程序)抽象:接收一個請求,以某種方式滿足它;
◆ConcreteHandlers(具體的處理程序):接收一個請求,設法滿足它,如果不成功就委派給下一個處理程序。
下面的代碼實現了一個最著名的責任鏈示例:多級緩存。

復制代碼 代碼如下:


/**
* 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";


關于PHP責任鏈設計模式的一些實現說明:
◆責任鏈可能已經存在于對象圖中,和復合模式的例子一樣;
◆此外,Handler抽象可能存在,也可能不存在,最好的選擇是一個分開的Handler接口只可以執行handleRequest()操作,不要強制一個鏈只在一個層次中,因為后面的已經存在了;
◆也可能引入一個抽象類,但由于請求處理是一個正交關注,因此具體的類可能已經繼承了其它類;
◆通過constructor 或setter,Handler(或下一個Handler)被注入到Client或前一個Handler;
◆請求對象通常是一個ValueObject,也可能被實現為一個Flyweight,在PHP中,它可能是一個標量類型,如string,注意在某些語言中,一個string就是一個不變的ValueObject。

簡單的總結責任鏈模式,可以歸納為:用一系列類(classes)試圖處理一個請求request,這些類之間是一個松散的耦合,唯一共同點是在他們之間傳遞request. 也就是說,來了一個請求,A類先處理,如果沒有處理,就傳遞到B類處理,如果沒有處理,就傳遞到C類處理,就這樣象一個鏈條(chain)一樣傳遞下去。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 唐山市| 眉山市| 柳河县| 射阳县| 灵丘县| 利川市| 都昌县| 都安| 容城县| 嘉定区| 武冈市| 柳河县| 连城县| 盐源县| 佛学| 唐山市| 清新县| 延寿县| 青阳县| 墨竹工卡县| 宽甸| 手机| 哈尔滨市| 比如县| 宁武县| 绥棱县| 大庆市| 启东市| 商洛市| 和田市| 连州市| 阳原县| 达日县| 宁明县| 郸城县| 曲阳县| 行唐县| 剑河县| 台北市| 图木舒克市| 鄯善县|