设计模式(十七):职责链模式

2018-12-17  本文已影响5人  骑着母猪砍大象

转载请注明作者和出处https://www.jianshu.com/p/b77f5a97fee9

运行平台: Windows

php版本: php7.0

作者简介: 一个本该成为游戏职业选手却被编程耽误的程序员


指责链模式

职责链模式,类似于我们在公司发送一个加薪的申请,首先主管看了,发现没有权限,转交给经理,经理看了,发现也没有权限,转交给总监,总监经过调查,发现你的表现还可以,于是同意了你的申请,这样一个链式传递就是职责链模式。

责任链模式定义:

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

责任链模式角色:

<?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);
上一篇 下一篇

猜你喜欢

热点阅读