php八大设计模式之职责链模式

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

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

例子:

  比如某同学骂人,我们要告诉纪委;旷课我们要告诉班长;打架我们要告诉班主任。不同情况对应不同的人,产生的结果也是不同的,在 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();
?>

猜你喜欢

转载自blog.csdn.net/j393819650/article/details/67644286