PHP设计模式--责任链模式

109 阅读1分钟
<?php
/**
 * 责任链模式
 */
class Chain{
    protected $leader;
    public function __construct(){
        if($this->upper){
            $this->leader = new $this->upper();
        }
    }

    public function proc($danger){
        if($this->level >= $danger || $this->upper=== null){
            $this->doProc();
        }else{
            $this->leader->proc($danger);
        }
    }
}

class BanZhu extends Chain{
    protected $level =1;
    protected $upper = 'Police';

    protected function doProc(){
        echo '删帖';
    }

}

class Police extends Chain{
    protected $level =2;
    protected $upper = 'Guoan';

    protected function doProc(){
        echo '调查';
    }

}

class Guoan extends Chain{
    protected $level =3;
    protected $upper = null;

    protected function doProc(){
        echo '抓人';
    }

}

$danger = 3;
$client = new BanZhu();
$client->proc($danger);

var_dump($client);

GoF定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

打印出来会发现都有一个层级。

  • 责任链非常适合的一种场景,就是对请求参数进行逐层过滤,就像我们工作时使用钉钉之类的办公软件。当需要提加班或者休假申请时,那一层层的审批流程就是对这个模式最完美的解释
  • 我们可以拦截请求,直接返回,也可以对请求内容进行完善修改交给下一个类来进行处理,但至少有一个类是要返回结果的。
  • 请求不一定都会被处理,也有可能完全不处理就返回或者传递给下一个处理类来进行处理

感谢分享:mp.weixin.qq.com/s?__biz=MzI…