轉載請注明作者和出處:http://www.reibang.com/p/b77f5a97fee9
運行平臺: Windows
php版本: php7.0
作者簡介: 一個本該成為游戲職業(yè)選手卻被編程耽誤的程序員
指責鏈模式
職責鏈模式善玫,類似于我們在公司發(fā)送一個加薪的申請干奢,首先主管看了严嗜,發(fā)現(xiàn)沒有權限失息,轉交給經(jīng)理髓涯,經(jīng)理看了杂数,發(fā)現(xiàn)也沒有權限,轉交給總監(jiān)锉试,總監(jiān)經(jīng)過調查猫十,發(fā)現(xiàn)你的表現(xiàn)還可以,于是同意了你的申請呆盖,這樣一個鏈式傳遞就是職責鏈模式拖云。
責任鏈模式定義:
在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈应又。請求在這個鏈上傳遞江兢,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求丁频,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責任杉允。
責任鏈模式角色:
- 抽象處理者(Handler)角色:定義出一個處理請求的接口邑贴。如果需要,接口可以定義 出一個方法以設定和返回對下家的引用叔磷。
- 具體處理者(ConcreteHandler)角色:具體處理者接到請求后拢驾,可以選擇將請求處理掉,或者將請求傳給下家改基。由于具體處理者持有對下家的引用繁疤,因此,如果需要秕狰,具體處理者可以訪問下家稠腊。
<?php
// 減免類
class Reduce{
// 減免金額
public $reduceMoney;
}
// 審批抽象類(需要具體審批類實現(xiàn))
abstract class Manager{
// 審批角色
protected $roleName;
// 上級審批對象
protected $managerObj;
// 設置審批角色名稱
public function __construct($roleName) {
$this->roleName = $roleName;
}
// 設置當前審批角色的上級角色
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){
//轉發(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){
//轉發(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){
//轉發(fā)上級角色審批
echo $this->roleName."審批拒絕".PHP_EOL;
}else{
echo $this->roleName."審批通過".PHP_EOL;
}
}
}
//客戶端調用
$manage1 = new LeaderManager('組長');
$manage2 = new ZongJianManager('總監(jiān)');
$manage3 = new BossManager('老板');
//實例化請求減免類
$reduce = new Reduce();
$reduce->reduceMoney = 1000000;
//設定層級關系
$manage1->setLeader($manage2);
$manage2->setLeader($manage3);
$manage1->audit($reduce);