概述責任鏈模式是一種對象的行為模式。在責任鏈模式裡,很多個物件由每一個對象對其下家的引用而串連起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的用戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響用戶端的情況下動態重新組織和分配責任UML圖描述一個簡單責任鏈模式的實現責任鏈模式涉及到的角色如下:
- 抽象處理者(Handler)角色:定義出一個處理請求的介面。如果需要,介面可以定義出一個方法以設定和返回對下家的引用。這個角色通常由一個php的抽象類別或介面實現。中Handler類的彙總關係給出了具體子類對下家的引用,抽象方法handleRequest()規範了子類處理請求的操作
- 具體處理者(ConcreateHandle)角色:具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要,具體處理這可以訪問下家
PHP原始碼
<?php/** * 抽象處理者角色 * @author wzy * */abstract class Handle{ /** * 持有後繼的責任對象 * * @var object */ protected $successor; /** * 示意處理請求的方法,雖然這個示意方法是沒有傳入參素的 * 但實際是可以傳入參數的,根據具體需要來選擇是否傳遞參數 */ public abstract function handleRequest (); /** * 取值方法 * * @return object */ public function getSuccessor () { return $this->successor; } /** * 賦值方法,設定後繼的責任對象 * * @param object $objsuccessor */ public function setSuccessor ($objsuccessor) { $this->successor = $objsuccessor; }}/** * 具體處理者角色 * * @author wzy * */class ConcreateHandler extends Handle{ /** * 判斷是否有後繼的責任對象 * 如果有,就轉寄請求給後繼的責任對象 * 如果沒有,則處理請求 * * @see Handle::handleRequest() */ public function handleRequest () { if ($this->getSuccessor() != null) { echo "放過請求,將請求轉寄給後繼的責任對象!<br>"; $this->getSuccessor()->handleRequest(); } else { echo "處理請求,處理過程省略...<br>"; } }}/** * 用戶端代碼 */// 組裝責任鏈$handle1 = new ConcreateHandler();$handle2 = new ConcreateHandler();$handle1->setSuccessor($handle2);// 提交請求$handle1->handleRequest();?>
通過代碼可以看出,用戶端建立了兩個處理者對象,並指定第一個處理者對象的下家是第二個處理者對象,而第二個處理者對象卻沒有下家。然後用戶端將請求傳遞給第一個處理者對象