责任链模式
1. 模式介绍
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这个链传递该请求,直到有一个对象处理它为止。
2.模式组成
2.1 抽象处理者(Handler)角色:
定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
2.2 具体处理者(ConcreteHandler)角色:
具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
3 模式结构
4 项目应用
4.1 设计一个请假已用,<=2天,经理批准即可; <=5天,总监批准,其它总经理批准。
4.2 源码分析
示例情景一:
当用户发布一个帖子时:
如果版主可以决定,就版主处理;
如果版主不能决定,就交给上一级管理员处理;
如果管理员不能决定,就交给上一级治安部门处理;
示例情景二:
当一个员工请假时:
如果组长可以决定,就组长处理;
如果组长不能决定,就交给上一级主管处理;
如果主管不能决定,就交给上一级经理处理;
如果经理不能决定,就交给上一级人事处理。
//示例:当处理一个帖子时,
//如果不文明严重程度处理
//1级,版主删帖
//2级,管理员封账号
//3级,治安部门管理
//版主
class board{
protected $level = 1;//当前级别为1
protected $top = 'admin';//高一级的处理
public function process($lv=1){
if($lv <= $this->level){
echo '版主删帖' . '<br/>';
}else{
$topCls = new $this->top;
$topCls->process($lv);
}
}
}
//管理员
class admin{
protected $level = 2;//当前级别为2
protected $top = 'police';//高一级的处理
public function process($lv=2){
if($lv <= $this->level){
echo '管理员冻结登录账号' . '<br/>';
}else{
$topCls = new $this->top;
$topCls->process($lv);
}
}
}
//治安部门
class police{
public function process($lv=3){
echo '治安部门参与治理' . '<br/>';
}
}
$lv = isset($_GET['lv'])?$_GET['lv']:1;
$cls = new board();
$cls->process($lv);