当发生一种事情时,我们需要要对应职责的事物去处理对应的事情。
   或者去找最近的类(就是级别最低的)去解决,如果解决不了就顺着往上找职责更高的,直到解决为止。

  注意:一定是要有一个职责最高的类,否则会有问题。

例子:

  比如某同学骂人,我们要告诉纪委;旷课我们要告诉班长;打架我们要告诉班主任。不同情况对应不同的人,产生的结果也是不同的,在 php 中我们是怎么实现的呢?
<?php
    /**
      * 假设:
      *    骂人:1
      *    旷课:2
      *    打架:3
     */
?>

面向过程实现举报:

<?php
    //三种情况,该是前台传过来,这儿用数组代替了。
    $arr=[1,2,3];
    //随机获得一种情况。
    array_push($arr,4);
    shuffle($arr);
    $pop=array_pop($arr);
    echo $pop;
    //纪委类。
    class Dis{
        public function go(){
            echo "批评"."<br>";
        }
    }
    //班长类。
    class Monitor{
        public function go(){
            echo"扣5分"."<br>";
        }
    }
    //班主任类。
    class Headmaster{
        public function go(){
            echo "叫家长"."<br>";
        }
    }
    if($pop==1){
        //如果事态是 1.
        $jg=new Dis();
        $jg->go();
    }else if($pop==2){
        //如果事态是 2.
        $jg=new Monitor();
        $jg->go();
    }else{
        //如果事态是 3.
        $jg=new Headmaster();
        $jg->go();
    }
?>

职责链模式完成举报功能:

<?php
    header("content-type:text/html;charset=utf8");
    /**
     * 责任链模式完成举报功能。
     *     每个对象存储着自己的权限以及上一级的引用,如果自己处理不了,交给上一级。
     */
    //应该前台传值过来,这里数组代替。
    $arr=[1,2,3];
    //随机打乱数组,保证随机性。
    shuffle($arr);
    //获得数组最后一个值。
    $pop=array_pop($arr);
    class Dis{   #纪委类。
        //权值。
        protected $root=1;
        //上级。
        protected $up="Monitor";
        public function go($int){
            if($int<=$this->root){
                echo "批评"."<br>";
            }else{
                $this->up=new $this->up;
                $this->up->go($int);
            }
        }
    }
    class Monitor{  #班长类。
        //权值。
        protected $root=2;
        //上级。
        protected $up="Headmaster";
        public function go($int){
            if($int<=$this->root){
                echo "扣5分"."<br>";
            }else{
                $this->up=new $this->up;
                $this->up->go($int);
            }
        }
    }
    class Headmaster{   #班主任类。
        protected $root=null;
        protected $up=null;
        public function go(){
            echo "叫家长<br>";
        }
    }
    //发生事情去找最近的职责人。
    $gos= new Dis();
    $gos->go($pop);
?>

管理组模式完成举报:

<?php
 header("content-type:text/html;charset=utf8");
    /**
     * 我认为责任链没有很好的扩展性,在增加新的对应职责人员时,需要修改旧的代码,不符合“开闭原则”。
     * 也可以这样实现:
     */
    //应该前台传值过来,这里数组代替。
    $arr=[1,2,3];
    //将管理纳入一个管理组【默认】。
    $roots=['Dis','Monitor','Headmaster'];
    //纪委类。
    class Dis{
        public function go(){
            echo "批评"."<br>";
        }
    }
    //班长类。
    class Monitor{
        public function go(){
            echo "扣5分"."<br>";
        }
    }
    //班主任类。
    class Headmaster{
        public function go(){
            echo "叫家长<br>";
        }
    }

    //假如新增一个主任类。
    class Director{
        public function go(){
            echo "停课7天<br>";
        }
    }
    //将主任类纳入管理组。
    array_push($roots,"Director");
    //将事态纳入事态组。
    array_push($arr,4);

    //随机打乱数组,保证随机性。
    shuffle($arr);
    //获得数组最后一个值。

    //去找对应职责的人。
    $pop=array_pop($arr);
    $news=new $roots[$pop-1];
    $news->go();
?>

php八大设计模式之职责链模式的更多相关文章

  1. php设计模式之职责链模式

    <?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这 ...

  2. 设计模式之职责链模式(JAVA实现)

    学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...

  3. 设计模式-利用职责链模式消除if

    本文是对职责链设计模式的应用(变种),所以假设读者已经掌握了职责链设计模式,职责链模式只会应景简介. 本文主要内容: 需求(ShitCode) 职责链模式简介 设计理念 代码演示(消除if) 应用总结 ...

  4. 设计模式:职责链模式(Chain Of Responsibility)

    定  义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...

  5. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 深入理解JavaScript系列(38):设计模式之职责链模式

    介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...

  7. php实现设计模式之 职责链模式

    <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...

  8. JS常用的设计模式(15)—— 职责链模式

    职责链模式是一个对象A向另一个对象B发起请求,如果B不处理,可以把请求转给C,如果C不处理,又可以把请求转给D.一直到有一个对象愿意处理这个请求为止. 打个比方,客户让老板写个php程序.老板肯定不写 ...

  9. 设计模式之职责链模式(Chain of Responsibility)

    职责链模式原理: 职责链模式和装饰模式以及组合模式类似的地方是都维持着指向父类的指针, 不同点是职责链模式每个子类都继承父类的指针及每个之类都维持着指向父类的指针,而组合模式与装饰模式是组合类鱼装饰类 ...

随机推荐

  1. linux 下的文件搜索、可执行文件搜索

    1. whereis 与 which 速度快,只是模糊查询,例如查询 $ whereis mysql,则会将mysql, mysql.ini, mysql*所在的目录都找出来: whereis 查看的 ...

  2. Codeforces 987C. Three displays(o(n^2))

    刚开始三重循环tle test11.后来想了个双重循环的方法. 解题思路: 1.双重循环一次,用一个一位数组存j和比j小的i的和的最小值. 2.再双重循环一次,找到比j大的数k,更新结果为ans=mi ...

  3. 虚拟机CentOS6.8下安装JDK

    CentOS6.8下 首先下载JDK,执行命令如下: wget http://download.oracle.com/otn-pub/java/jdk/8u172-b11/a58eab1ec24242 ...

  4. 解决new Date的值为Invalid Date、NaN-NaN的问题

    错误代码: let timespan = 1515239514230; let dateTime = new Date(timespan); console.log(dateTime) // 返回 I ...

  5. 洛谷 P4932 浏览器 (思维题)

    题目大意:给你一个序列,求满足$x_{i}\: xor\; x_{j}$在二进制下1的数量为奇数的数对数量 打月赛的时候真没想出来,还是我太弱.. xor意义下,对于两个数,假设它们两个每一位都是2个 ...

  6. 洛谷 P1045 麦森数 (快速幂+高精度+算位数骚操作)

    这道题太精彩了! 我一开始想直接一波暴力算,然后叫上去只有50分,50分超时 然后我改成万位制提高运算效率,还是只有50分 然后我丧心病狂开long long用10的10次方作为一位,也就是100亿进 ...

  7. 【codeforces 370C】Mittens

    [题目链接]:http://codeforces.com/problemset/problem/370/C [题意] 给你n个人,每个人都有一双相同颜色的手套; 然允许在所有人之间交换手套; (每个人 ...

  8. Python 安装 httplib2

    简述 httplib2 是一个使用 Python 写的支持的非常全面的 HTTP 特性的库.需要 Python2.3 或更高版本的运行环境,0.5.0 版及其以后包含了对 Python3 的支持. 简 ...

  9. 响应http报文中的Date属性与cookie过期时间的关系

    今天在測试.net时,发现一个莫名其妙的问题:cookie老是保存不到浏览器端; 经过细致的比对成功与不成功的报文,居然无意中发现好像Date与它有关系,这太让我意想不到了,从来不知道cookie保存 ...

  10. lenovo G系列重装系统

    lenovo G41 的笔记本默认安装的是win8 中文版 的操作系统,使用非常不方便,用U盘重装成WIN7的系统. 1.用启动工具软件制作U盘启动盘.  详细能够參照  http://www.uqi ...