转载请注明作者和出处://www.greatytc.com/p/b77f5a97fee9
运行平台: Windows
php版本: php7.0
作者简介: 一个本该成为游戏职业选手却被编程耽误的程序员
指责链模式
职责链模式,类似于我们在公司发送一个加薪的申请,首先主管看了,发现没有权限,转交给经理,经理看了,发现也没有权限,转交给总监,总监经过调查,发现你的表现还可以,于是同意了你的申请,这样一个链式传递就是职责链模式。
责任链模式定义:
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链模式角色:
- 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。
- 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
<?php
// 减免类
class Reduce{
// 减免金额
public $reduceMoney;
}
// 审批抽象类(需要具体审批类实现)
abstract class Manager{
// 审批角色
protected $roleName;
// 上级审批对象
protected $managerObj;
// 设置审批角色名称
public function __construct($roleName) {
$this->roleName = $roleName;
}
// 设置当前审批角色的上级角色
public function setLeader(Manager $manager){
$this->managerObj = $manager;
}
//审批方法
abstract function audit(Reduce $reduce);
}
class LeaderManager extends Manager{
//可减免金额最大值
CONST REDUCE_MONEY = 1000;
//执行审批
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;
//执行审批
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;
//执行审批
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);