<?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定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
打印出来会发现都有一个层级。
- 责任链非常适合的一种场景,就是对请求参数进行逐层过滤,就像我们工作时使用钉钉之类的办公软件。当需要提加班或者休假申请时,那一层层的审批流程就是对这个模式最完美的解释
- 我们可以拦截请求,直接返回,也可以对请求内容进行完善修改交给下一个类来进行处理,但至少有一个类是要返回结果的。
- 请求不一定都会被处理,也有可能完全不处理就返回或者传递给下一个处理类来进行处理