LaneBlog

蝼蚁虽小,也有梦想

PHP Socket服务 | PHP微信开发框架 | 开源博客

面向对象的洗礼:设计模式(二十四)之职责链模式

Clicks: 2149 Date: 2014-04-29 13:38:18 Power By 李轩Lane

    职责链模式解决了请求需要经过大量的臃肿的逻辑判断,设计模式的职责链模式采用了层层上报的方式,请求发送给响应方,响应方1若不能处理,则发送给响应2,响应2若不能处理则发送给响应3...直到处理为止。职责链模式的关键是,当客户提交一个请求时,请求是沿着一个链条进行传递,直到有一个对象可以负责这个请求为止。
    职责链模式:使多个对象都有机会处理请求,从而避免了请求者和响应者的耦合关系,将响应者连成一个链条,层层传递,沿着这个链条传递请求,直到可以有一个对象处理为止。
    职责链的好处:请求者和响应者都没有对方的明确信息,链中的对象也不知道链的结构,结果是职责模式中的职责链可以简化对象的相互连接,降低耦合,他们只需要保存一个继承者,而不需要保存所有的继承者。在增加和修改一个请求的结构时,更加灵活。
    场景:请假,组长只能批1天的请假,技术总监可以批3天的请假,3天以上需要老板亲自批示。以PHP为代码环境来描述职责链模式。
    
<?php
abstract class Manager{
    protected $position;
    protected $lead;
    public function getPosition(){
        return $this->position;
    }
    public function setPosition($position){
        $this->position = $position;
    }
    public function setLead($leadObj){
        $this->lead = $leadObj;
    }
}
class GroupLeader extends Manager{
    public function __construct($position){
        $this->position = $position;
    }
    public function response($day){
        if($day == 1){
            echo $this->position . '批准<br>';
        }else{
            echo $this->position . '无权处理,请示上级<br>';
            $this->lead->response($day);
        }
    }
}
class Director extends Manager{
    public function __construct($position){
        $this->position = $position;
    }
    public function response($day){
        if($day > 1 && $day <= 3){
            echo $this->position . '批准<br>';
        }else{
            echo $this->position . '无权处理,请示上级<br>';
            $this->lead->response($day);
        }
    }
}
class CEO extends Manager{
    public function __construct($position){
        $this->position = $position;
    }
    public function response($day){
        if($day > 3){
            echo $this->position . '批准<br>';
        }else{
            echo $this->position . '无权处理,请示上级<br>';
            $this->lead->response($day);
        }
    }
}
//客户端/接口
$groupLead = new GroupLeader('组长');
$director  = new Director ('总监');
$ceo = new CEO('首席执行官');
$groupLead->setLead($director);
$director->setLead($ceo);
$dayArr = array(1, 2, 3, 4, 5);
foreach($dayArr as $day){
    echo '请假' . $day . '天结果<br>';
    $groupLead->response($day);
    echo '<br><br><br>';
}
Add Comment
©2014 www.lanecn.com , All rights reserved. Power By Li Xuan.  京ICP备14005030号