责任链模式就是指每个处理人决定它能处理哪些命令对象,当它无权处理时会把命令对象交下一个处理人,以下是php 实现责任链模式的代码
trait ResponsibilityMode
{
protected $_level;
protected $_nxt;
//维持所有在责任链中的对象的权柄及其class name
protected $_map = array(
1 => 'Board',
2 => 'Admin',
3 => 'SuperAdmin',
4 => 'Police'
);
public final function __construct($level, $nxt) {
//当前对象的Level
$this->_level = $level;
//当前对象的下一个对象的class name
$this->_nxt = $this->_map[$nxt] ?? "";
}
public final function process($lv = 1) {
//判断当前对象的权柄是否能够处理
if ($lv <= $this->_level) {
echo $this->_map[$this->_level] . ' is processing this issue' . PHP_EOL;
} else {
//如果没人能处理
if ($this->_nxt === "") {
echo "sorry nobody can handle this issue!!!!";
exit;
}
//当前的权柄不够,交给下一个人处理
$nxtCls = new $this->_nxt($this->_level + 1, $this->_level + 2);
$nxtCls->process($lv);
}
}
}
class Board{use ResponsibilityMode;}
class Admin{use ResponsibilityMode;}
class SuperAdmin{use ResponsibilityMode;}
class Police{use ResponsibilityMode;}
$b = new SuperAdmin(3, 4);
$b->process(4);
结果: