面向对象的洗礼:设计模式(二十四)之职责链模式
职责链模式解决了请求需要经过大量的臃肿的逻辑判断,设计模式的职责链模式采用了层层上报的方式,请求发送给响应方,响应方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>'; }