1. 程式人生 > >php 設計模式之責任鏈模式

php 設計模式之責任鏈模式

 責任鏈模式
1. 模式介紹

使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係,將這個物件連成一條鏈,並沿著這個鏈傳遞該請求,直到有一個物件處理它為止。

2.模式組成
  2.1 抽象處理者(Handler)角色:
        定義出一個處理請求的介面。如果需要,介面可以定義 出一個方法以設定和返回對下家的引用。這個角色通常由一個Java抽象類或者Java介面實現。上圖中Handler類的聚合關係給出了具體子類對下家的引用,抽象方法handleRequest()規範了子類處理請求的操作。
2.2 具體處理者(ConcreteHandler)角色:

具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
3 模式結構


4 專案應用
4.1 設計一個請假已用,<=2天,經理批准即可; <=5天,總監批准,其它總經理批准。
4.2 原始碼分析
class Request
{
    public $name;
    public $day;
    public $reason;

    public function __construct($name,$day,$reason)
    {
        $this->name = $name
; $this->day = $day; $this->reason = $reason; } } abstract class Manager { //姓名 protected $name; //上級 protected $superior; public function __construct($name) { $this->name = $name; } /** * 設定上級 * * @param Manager $superior * @access public * @return void
*/ public function setSuperior(Manager $superior) { $this->superior = $superior; } //處理請求 abstract public function doApplication(Request $request); //列印結果 public function displayResult(Request $request) { echo "請假人:{$request->name},請假天數:{$request->day},批准人:{$this->name}\r\n"; } } //經理 class CommonManager extends Manager { public function doApplication(Request $request) { if($request->day <= 2) { $this->displayResult($request); return; } //上級處理 if($this->superior instanceof Majordomo) { $this->superior->doApplication($request); } else { throw new Exception('CommonManager 上級不為 Majordomo'); } } } //總監 class Majordomo extends Manager { public function doApplication(Request $request) { if($request->day <= 5) { $this->displayResult($request); return; } //上級處理 if($this->superior instanceof GeneralManager) { $this->superior->doApplication($request); } else { throw new Exception('CommonManager 上級不為 GeneralManager'); } } } //總經理 class GeneralManager extends Manager { public function doApplication(Request $request) { $this->displayResult($request); } } function run() {/*{{{*/ $commonManager = new CommonManager('zhangsan'); $majordomo = new Majordomo('lisi'); $generalManager = new GeneralManager('wangwu'); //設定責任鏈 $commonManager->setSuperior($majordomo); $majordomo->setSuperior($generalManager); for($i = 1; $i < 8;$i++) { $name = 'test'.$i; $day = rand(1,10); $reason = '我要請假'.$day; $request = new Request($name,$day,$reason); $commonManager->doApplication($request); echo '</br>'; } }/*}}}*/ run();
參考:https://blog.csdn.net/clevercode/article/details/52804839