簡單介紹PHP的責(zé)任鏈編程模式
概述
責(zé)任鏈模式是一種對象的行為模式。在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)的重新組織和分配責(zé)任
責(zé)任鏈模式的定義
使多個對象都有機(jī)會處理請求,從而避免了請求的發(fā)送者和接受者之間耦合關(guān)系,將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有對象處理它為止。
責(zé)任鏈模式的優(yōu)點
最為顯著的優(yōu)點就是將請求和處理分開。請求者可以不用知道是誰處理的,處理者可以不用知道請求的全貌,兩者解耦,提高系統(tǒng)的靈活性。
責(zé)任鏈模式的缺點
一是性能問題,每個請求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長的時候,性能是一個問題。二是調(diào)試不是很方便,特別是鏈條比較長的,環(huán)節(jié)比較多的時候,由于采用了類似遞歸的方式 ,調(diào)試的時候邏輯可能比較復(fù)雜。
責(zé)任鏈模式涉及到的角色如下:
抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要,接口可以定義出一個方法以設(shè)定和返回對下家的引用。這個角色通常由一個php的抽象類或接口實現(xiàn)。上圖中Handler類的聚合關(guān)系給出了具體子類對下家的引用,抽象方法handleRequest()規(guī)范了子類處理請求的操作
具體處理者(ConcreateHandle)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理這可以訪問下家
來看一個PHP的責(zé)任鏈模式編程實例:
<?php
/**
* 抽象處理者角色
* @author wzy
*
*/
abstract class Handle
{
/**
* 持有后繼的責(zé)任對象
*
* @var object
*/
protected $successor;
/**
* 示意處理請求的方法,雖然這個示意方法是沒有傳入?yún)⑺氐?
* 但實際是可以傳入?yún)?shù)的,根據(jù)具體需要來選擇是否傳遞參數(shù)
*/
public abstract function handleRequest ();
/**
* 取值方法
*
* @return object
*/
public function getSuccessor ()
{
return $this->successor;
}
/**
* 賦值方法,設(shè)置后繼的責(zé)任對象
*
* @param object $objsuccessor
*/
public function setSuccessor ($objsuccessor)
{
$this->successor = $objsuccessor;
}
}
/**
* 具體處理者角色
*
* @author wzy
*
*/
class ConcreateHandler extends Handle
{
/**
* 判斷是否有后繼的責(zé)任對象
* 如果有,就轉(zhuǎn)發(fā)請求給后繼的責(zé)任對象
* 如果沒有,則處理請求
*
* @see Handle::handleRequest()
*/
public function handleRequest ()
{
if ($this->getSuccessor() != null) {
echo "放過請求,將請求轉(zhuǎn)發(fā)給后繼的責(zé)任對象!<br>";
$this->getSuccessor()->handleRequest();
} else {
echo "處理請求,處理過程省略...<br>";
}
}
}
/**
* 客戶端代碼
*/
// 組裝責(zé)任鏈
$handle1 = new ConcreateHandler();
$handle2 = new ConcreateHandler();
$handle1->setSuccessor($handle2);
// 提交請求
$handle1->handleRequest();
?>
通過代碼可以看出,客戶端創(chuàng)建了兩個處理者對象,并指定第一個處理者對象的下家是第二個處理者對象,而第二個處理者對象卻沒有下家。然后客戶端將請求傳遞給第一個處理者對象
- php設(shè)計模式 Chain Of Responsibility (職責(zé)鏈模式)
- PHP設(shè)計模式之責(zé)任鏈模式的深入解析
- PHP實現(xiàn)基于狀態(tài)的責(zé)任鏈審批模式詳解
- PHP設(shè)計模式之觀察者模式(Observer)詳細(xì)介紹和代碼實例
- php設(shè)計模式 Proxy (代理模式)
- PHP常用的三種設(shè)計模式匯總
- php設(shè)計模式 Interpreter(解釋器模式)
- PHP經(jīng)典面試題之設(shè)計模式(經(jīng)常遇到)
- php設(shè)計模式之單例模式使用示例
- php 設(shè)計模式之 工廠模式
- php基礎(chǔ)設(shè)計模式大全(注冊樹模式、工廠模式、單列模式)
- php設(shè)計模式之職責(zé)鏈模式定義與用法經(jīng)典示例
PHP正則表達(dá)式函數(shù)preg_replace用法實例分析

