-
目的
1.建立一個(gè)對象鏈來按指定順序處理調(diào)用。如果其中一個(gè)對象無法處理命令帆疟,它會委托這個(gè)調(diào)用給它的下一個(gè)對象來進(jìn)行處理,以此類推镀岛。
-
角色
1.抽象處理者(Handler)角色:定義出一個(gè)處理請求的接口翔烁。如果需要渺氧,接口可以定義出一個(gè)方法以設(shè)定和返回對下家的引用。這個(gè)角色通常由一個(gè)php的抽象類或接口實(shí)現(xiàn)蹬屹。上圖中Handler類的聚合關(guān)系給出了具體子類對下家的引用侣背,抽象方法handleRequest()規(guī)范了子類處理請求的操作
2.具體處理者(ConcreateHandle)角色:具體處理者接到請求后,可以選擇將請求處理掉慨默,或者將請求傳給下家贩耐。由于具體處理者持有對下家的引用,因此厦取,如果需要潮太,具體處理這可以訪問下家
-
優(yōu)點(diǎn)
1.最為顯著的優(yōu)點(diǎn)就是將請求和處理分開。請求者可以不用知道是誰處理的虾攻,處理者可以不用知道請求的全貌铡买,兩者解耦,提高系統(tǒng)的靈活性霎箍。
2.一是性能問題奇钞,每個(gè)請求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長的時(shí)候漂坏,性能是一個(gè)問題景埃。二是調(diào)試不是很方便,特別是鏈條比較長的顶别,環(huán)節(jié)比較多的時(shí)候谷徙,由于采用了類似遞歸的方式 ,調(diào)試的時(shí)候邏輯可能比較復(fù)雜驯绎。
-
代碼1
<?php
//示例:當(dāng)處理一個(gè)帖子時(shí)完慧,
//如果不文明嚴(yán)重程度處理
//1級,版主刪帖
//2級剩失,管理員封賬號
//3級骗随,治安部門管理
//版主
class board{
protected $level = 1;//當(dāng)前級別為1
protected $top = 'admin';//高一級的處理
public function process($lv=1){
if($lv <= $this->level){
echo '版主刪帖' . '<br/>';
}else{
$topCls = new $this->top;
$topCls->process($lv);
}
}
}
//管理員
class admin{
protected $level = 2;//當(dāng)前級別為2
protected $top = 'police';//高一級的處理
public function process($lv=2){
if($lv <= $this->level){
echo '管理員凍結(jié)登錄賬號' . '<br/>';
}else{
$topCls = new $this->top;
$topCls->process($lv);
}
}
}
//治安部門
class police{
public function process($lv=3){
echo '治安部門參與治理' . '<br/>';
}
}
$lv = isset($_GET['lv'])?$_GET['lv']:1;
$cls = new board();
$cls->process($lv);
-
代碼2
<?php
/**
* 抽象處理者角色
* @author wzy
*
*/
abstract class Handle
{
/**
* 持有后繼的責(zé)任對象
*
* @var object
*/
protected $successor;
/**
* 示意處理請求的方法,雖然這個(gè)示意方法是沒有傳入?yún)⑺氐?
* 但實(shí)際是可以傳入?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();
?>