天天看點

初識PHP設計模式--職責鍊模式

職責鍊模式(Responsibility)屬于行為型模型,還是比較好了解,就是對于某個請求,一級不能處理就轉到二級處理。

 生活中用的最普遍的例子就是,公司申請撥款,一萬左右的經費,經理可以準許通過,但是達到十萬左右的經理就沒有權限審批了,需要轉交到總監那裡去審批,這就是一條職責鍊。

 這樣系統可以在不影響用戶端的情況下,對責任進行動态的配置設定。

<?php

// 請求類
Class Request
{
    /**
     * 請求金額
     * @var string
     */
    public $request_money; 
}

// 抽象管理者
abstract Class Manager
{
    /**
     * 請求金額
     * @var string
     */
	protected $name;

    /**
     * 管理者
     * @var object
     */
	protected $manager;

    /**
     * 構造函數
     * @access public 
     * @param  string $_name 上司姓名  
     */
    public function __construct($_name){
        $this->name = $_name;
    }

    /**
     * 設定傳遞上級上司
     * @access public 
     * @param  object $_name 上級上司姓名
     */
    public function setLeader(Manager $_mana){
        $this->manager = $_mana;
    }

    /**
     * 申請方法
     * @access public
     * @param  object $_req 金額 
     */    
    abstract public function Apply(Request $_req);
}

// 朱主任的權限類
Class Director extends Manager
{
    /**
     * 構造函數
     * @access public
     * @param  string $_name 朱主任  
     */
	public function __construct($_name){
        parent::__construct($_name);
	}

    /**
     * 申請方法
     * @access public
     * @param  object $_req 金額 
     */    
	public function Apply(Request $_req){
		   
           // var_dump($this->name);
            if($_req->money <= 3000){
                echo $this->name.":準許了".$_req->money."的金額";
            }
            else
            {
            	if(isset($this->manager))  
	            {  
	                $this->manager->Apply($_req);  
	            }  
            }
	}
}

// 田經理的權限類
Class Amaldar extends Manager
{
    /**
     * 構造函數
     * @access public
     * @param  string $_name 田經理  
     */
	public function __construct($_name){
        parent::__construct($_name);
	}

    /**
     * 申請方法
     * @access public
     * @param  object $_req 金額  
     */    
	public function Apply(Request $_req){
		if($_req->money > 3000 && $_req->money <= 10000){
             echo $this->name.":準許了".$_req->money."的金額";
        }
        else
        {
            if(isset($this->manager))  
            {  
                $this->manager->Apply($_req);  
            } 
        }
	}
}

// 鄭總監的權限類
Class Ceo extends Manager
{
    /**
     * 構造函數
     * @access public
     * @param  string $_name 鄭總監 
     */    
	public function __construct($_name){
		parent::__construct($_name);
	}

    /**
     * 申請方法
     * @access public
     * @param  object $_req 金額 
     */     
	public function Apply(Request $_req){
		if($_req->money > 10000){
             echo $this->name.":準許了".$_req->money."的金額";
        }
	}
}


           
<?php
header("Content-Type:text/html;charset=utf-8");  
echo "<pre>";
//--------------------職責鍊模式----------------------  
require_once "Responsibility.php";  

// 建立各上司對象
$director = new Director("朱主任");
$amaldar = new Amaldar("田經理");
$ceo = new Ceo("鄭總監");

// 設定上級上司
$director -> setLeader($amaldar); 
$amaldar -> setLeader($ceo);

// 請求類
$req = new Request();

// 審批金額為3000
// $req->money = "3000";

// 審批金額為10000
$req->money = "10000";

// 審批金額為20000
// $req->money = "20000";

// 送出申請
$director->Apply($req);

           

輸出結果:

田經理:準許了10000的金額      

繼續閱讀