<?php //責任鏈模式定義:在責任鏈模式裏,不少對象由每個對象對其下家的引用而鏈接起來造成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪個對象最終處理這個請求,這使得系統能夠在不影響客戶端的狀況下動態地從新組織和分配責任。 //責任鏈模式涉及到的角色以下所示: //抽象處理者(Handler)角色:定義出一個處理請求的接口。若是須要,接口能夠定義 出一個方法以設定和返回對下家的引用。這個角色一般由一個Java抽象類或者Java接口實現。上圖中Handler類的聚合關係給出了具體子類對下家的引用,抽象方法handleRequest()規範了子類處理請求的操做。 //具體處理者(ConcreteHandler)角色:具體處理者接到請求後,能夠選擇將請求處理掉,或者將請求傳給下家。因爲具體處理者持有對下家的引用,所以,若是須要,具體處理者能夠訪問下家。 /** * 減免類 */ class Reduce{ /** * 減免金額 * @var float */ public $reduceMoney; } /** * 審批抽象類(須要具體審批類實現) */ abstract class Manager{ /** * 審批角色 * @var string */ protected $roleName; /** * 上級審批對象 * @var OBJECT */ protected $managerObj; /** * 設置審批角色名稱 * @param string $roleName */ public function __construct($roleName) { $this->roleName = $roleName; } /** * 設置當前審批角色的上級角色 * @param Manager $manager */ public function setLeader(Manager $manager){ $this->managerObj = $manager; } //審批方法 abstract function audit(Reduce $reduce); } class LeaderManager extends Manager{ //可減免金額最大值 CONST REDUCE_MONEY = 1000; /** * 執行審批 * @param Reduce $reduce */ public function audit(Reduce $reduce) { if($reduce->reduceMoney > self::REDUCE_MONEY){ //轉發上級角色審批 $this->managerObj->audit($reduce); }else{ echo $this->roleName."審批經過".PHP_EOL; } } } class ZongJianManager extends Manager{ //可減免金額最大值 CONST REDUCE_MONEY = 10000; /** * 執行審批 * @param Reduce $reduce */ public function audit(Reduce $reduce) { if($reduce->reduceMoney > self::REDUCE_MONEY){ //轉發上級角色審批 $this->managerObj->audit($reduce); }else{ echo $this->roleName."審批經過".PHP_EOL; } } } class BossManager extends Manager{ //可減免金額最大值 CONST REDUCE_MONEY = 100000; /** * 執行審批 * @param Reduce $reduce */ public function audit(Reduce $reduce) { if($reduce->reduceMoney > self::REDUCE_MONEY){ //轉發上級角色審批 echo $this->roleName."審批拒絕".PHP_EOL; }else{ echo $this->roleName."審批經過".PHP_EOL; } } } //客戶端調用 $manage1 = new LeaderManager('組長'); $manage2 = new ZongJianManager('總監'); $manage3 = new BossManager('老闆'); //實例化請求減免類 $reduce = new Reduce(); $reduce->reduceMoney = 1000000; //設定層級關係 $manage1->setLeader($manage2); $manage2->setLeader($manage3); $manage1->audit($reduce);