職責鍊模式(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的金額