职责链模式 (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 的金额
来源: http://blog.csdn.net/qq_36101162/article/details/79219067