<?php /** * 3.5 职责链模式 * 定义: * 使多个对象都有机会处理请求,从而避免请求的 * 发送者和接受者直接的耦合关系。将这个对象连 * 成一条链,并沿着这条链传递该请求,直到有一 * 个对象处理它为止。 * 角色: * 1. 抽象Handler类 * 职责:定义一个处理请示的接口。 * 2. 具体Handler类 * 职责:具体处理者类,处理它所负责的请求 * ,它可访问它的后继者,如果可处理 * 该请求,就处理之,否则就将该请求 * 转发给它的后继者。 * * 优点: * 1. 增强了系统的可扩展性; * 2. 是可以避免过多的if或if-else语句; * 3. 减小了对象之间的耦合性; * 4. 可以根据需要自由组合工作流程。如工作流程 * 发生变化,可以通过重新分配对象链便可适应 * 新的工作流程; * 5. 责任分担。每个类只需处理自己该处理的工作 * (不该处理的传递给下一个对象完成),明确 * 各类的责任范围,符合单一职责原则。 * * 缺点: * 1. 使用此模式时会产生多处理者对象,但实际使 * 用的处理者对象却只有一个,这在某种程度讲 * 是资源的浪费。 * 2. 职责链建立的合理性要靠客户端来保证,增加 * 了程序的复杂性,也有可能由于职责链导致出 * 错。 * * 使用场景: * 1. 有多个对象可以处理一个请求,具体是哪个对象 * 处理该请求运行时自动确定。 * 2. 你想在不明确指定接受者的情况下,向多个对象 * 中的一个提交一个请求。 * 3. 可处理一个请求的对象集合应被动态指定。 */ //抽象Handler类 abstract class Handler{ protected $successor; public function setSuccessor(Handler $successor){ $this->successor=$successor; } abstract public function handlerRequest($request); } //具体Handler类 class ConcreteHandler1 extends Handler{ public function handlerRequest($request){ if($request >= 0 && $request < 10){ echo get_class($this).‘处理请求‘.$request; }else if($this->successor != null){ $this->successor->handlerRequest($request); } } } class ConcreteHandler2 extends Handler{ public function handlerRequest($request){ if($request >= 10 && $request < 20){ echo get_class($this).‘处理请求‘.$request; }else if($this->successor != null){ $this->successor->handlerRequest($request); } } } class ConcreteHandler3 extends Handler{ public function handlerRequest($request){ if($request >= 20 && $request < 30){ echo get_class($this).‘处理请求‘.$request; }else if($this->successor != null){ $this->successor->handlerRequest($request); } } } //客户端 //生成请求的具体处理对象 $h1=new ConcreteHandler1(); $h2=new ConcreteHandler2(); $h3=new ConcreteHandler3(); //设置处理对象的下一个负责人(即处理请求的对象) $h1->setSuccessor($h2); $h2->setSuccessor($h3); //具体的请求有职责链的第一个接收 $h1->handlerRequest(20); ?>
本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614788
原文:http://noican.blog.51cto.com/4081966/1614788