1.Chain Of Responsibility(责任链模式)
定义:有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,
直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求。
此处强调一点就是,链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,
需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象。
优点:责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。
降低类之间的耦合性,因为无法预知该请求的属于哪种类型,每个类如果碰到它不能处理只要放弃就可以了。
缺点:效率低,因为一个请求的完成可能遍历到最后才完成,当然也可以使用树的概念优化。
关系图:
2.举例
//处理者 public interface Handler { //处理方法 void operation(); } //链节点:指向下一个对象 public abstract class AbstractHandler { private Handler handler=null; public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } } //处理者实现类 class MyHandler extends AbstractHandler implements Handler { private String name; public MyHandler (String name) { this.name=name; } @Override public void operation() { System.out.println(name+"执行任务中。。。"); //调用下一个对象进行处理 if(getHandler()!=null) { Handler handler=getHandler(); handler.operation(); } else { System.out.println(name+"任务执行完毕!"); } } }
测试:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub MyHandler h1=new MyHandler("特工1号"); MyHandler h2=new MyHandler("特工2号"); MyHandler h3=new MyHandler("特工3号"); //设置责任链的对象顺序 h1.setHandler(h2); h2.setHandler(h3); //从h1开始执行任务 h1.operation(); } }
运行:
特工1号执行任务中。。。 特工2号执行任务中。。。 特工3号执行任务中。。。 特工3号任务执行完毕!
纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。
时间: 2024-10-09 22:46:35