轉(zhuǎn)載請注明作者和出處:http://www.itdecent.cn/p/b77f5a97fee9
運行平臺: Windows
php版本: php7.0
作者簡介: 一個本該成為游戲職業(yè)選手卻被編程耽誤的程序員
指責(zé)鏈模式
職責(zé)鏈模式,類似于我們在公司發(fā)送一個加薪的申請,首先主管看了,發(fā)現(xiàn)沒有權(quán)限,轉(zhuǎn)交給經(jīng)理,經(jīng)理看了,發(fā)現(xiàn)也沒有權(quán)限,轉(zhuǎn)交給總監(jiān),總監(jiān)經(jīng)過調(diào)查,發(fā)現(xiàn)你的表現(xiàn)還可以,于是同意了你的申請,這樣一個鏈?zhǔn)絺鬟f就是職責(zé)鏈模式。
責(zé)任鏈模式定義:
在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任。
責(zé)任鏈模式角色:
- 抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要,接口可以定義 出一個方法以設(shè)定和返回對下家的引用。
- 具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
<?php
// 減免類
class Reduce{
// 減免金額
public $reduceMoney;
}
// 審批抽象類(需要具體審批類實現(xiàn))
abstract class Manager{
// 審批角色
protected $roleName;
// 上級審批對象
protected $managerObj;
// 設(shè)置審批角色名稱
public function __construct($roleName) {
$this->roleName = $roleName;
}
// 設(shè)置當(dāng)前審批角色的上級角色
public function setLeader(Manager $manager){
$this->managerObj = $manager;
}
//審批方法
abstract function audit(Reduce $reduce);
}
class LeaderManager extends Manager{
//可減免金額最大值
CONST REDUCE_MONEY = 1000;
//執(zhí)行審批
public function audit(Reduce $reduce) {
if($reduce->reduceMoney > self::REDUCE_MONEY){
//轉(zhuǎn)發(fā)上級角色審批
$this->managerObj->audit($reduce);
}else{
echo $this->roleName."審批通過".PHP_EOL;
}
}
}
class ZongJianManager extends Manager{
//可減免金額最大值
CONST REDUCE_MONEY = 10000;
//執(zhí)行審批
public function audit(Reduce $reduce) {
if($reduce->reduceMoney > self::REDUCE_MONEY){
//轉(zhuǎn)發(fā)上級角色審批
$this->managerObj->audit($reduce);
}else{
echo $this->roleName."審批通過".PHP_EOL;
}
}
}
class BossManager extends Manager{
//可減免金額最大值
CONST REDUCE_MONEY = 100000;
//執(zhí)行審批
public function audit(Reduce $reduce) {
if($reduce->reduceMoney > self::REDUCE_MONEY){
//轉(zhuǎn)發(fā)上級角色審批
echo $this->roleName."審批拒絕".PHP_EOL;
}else{
echo $this->roleName."審批通過".PHP_EOL;
}
}
}
//客戶端調(diào)用
$manage1 = new LeaderManager('組長');
$manage2 = new ZongJianManager('總監(jiān)');
$manage3 = new BossManager('老板');
//實例化請求減免類
$reduce = new Reduce();
$reduce->reduceMoney = 1000000;
//設(shè)定層級關(guān)系
$manage1->setLeader($manage2);
$manage2->setLeader($manage3);
$manage1->audit($reduce);