-
目的
1.建立一个对象链来按指定顺序处理调用。如果其中一个对象无法处理命令,它会委托这个调用给它的下一个对象来进行处理,以此类推。
-
角色
1.抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个php的抽象类或接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作
2.具体处理者(ConcreateHandle)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理这可以访问下家
-
优点
1.最为显著的优点就是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。
2.一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个问题。二是调试不是很方便,特别是链条比较长的,环节比较多的时候,由于采用了类似递归的方式 ,调试的时候逻辑可能比较复杂。
-
代码1
<?php
//示例:当处理一个帖子时,
//如果不文明严重程度处理
//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);
-
代码2
<?php
/**
* 抽象处理者角色
* @author wzy
*
*/
abstract class Handle
{
/**
* 持有后继的责任对象
*
* @var object
*/
protected $successor;
/**
* 示意处理请求的方法,虽然这个示意方法是没有传入参素的
* 但实际是可以传入参数的,根据具体需要来选择是否传递参数
*/
public abstract function handleRequest ();
/**
* 取值方法
*
* @return object
*/
public function getSuccessor ()
{
return $this->successor;
}
/**
* 赋值方法,设置后继的责任对象
*
* @param object $objsuccessor
*/
public function setSuccessor ($objsuccessor)
{
$this->successor = $objsuccessor;
}
}
/**
* 具体处理者角色
*
* @author wzy
*
*/
class ConcreateHandler extends Handle
{
/**
* 判断是否有后继的责任对象
* 如果有,就转发请求给后继的责任对象
* 如果没有,则处理请求
*
* @see Handle::handleRequest()
*/
public function handleRequest ()
{
if ($this->getSuccessor() != null) {
echo "放过请求,将请求转发给后继的责任对象!<br>";
$this->getSuccessor()->handleRequest();
} else {
echo "处理请求,处理过程省略...<br>";
}
}
}
/**
* 客户端代码
*/
// 组装责任链
$handle1 = new ConcreateHandler();
$handle2 = new ConcreateHandler();
$handle1->setSuccessor($handle2);
// 提交请求
$handle1->handleRequest();
?>
网友评论