本文共 6026 字,大约阅读时间需要 20 分钟。
一、定义(概念)
二、适用场景
三、UML
四、代码
package chainOfResp;/** * *作者:Singit *时间: *描述:抽象处理角色 */public abstract class Handler { protected Handler successor; /** * *作者:Singit *时间: *描述:处理方法 */ public abstract void handlerRequest(String condition); public Handler getSuccessor() { return successor; } public void setSuccessor(Handler successor) { this.successor = successor; } }
package chainOfResp;/** * *作者:Singit *时间: *描述:具体处理角色 */public class ConcreteHandler1 extends Handler { @Override public void handlerRequest(String condition) { // 如果是自己的责任,就自己处理,负责传给下家处理 if(condition.equals("ConcreteHandler1")){ System.out.println( "ConcreteHandler1 handled "); return ; }else{ System.out.println( "ConcreteHandler1 passed "); getSuccessor().handlerRequest(condition); } }}
package chainOfResp;/** * *作者:Singit *时间: *描述:具体处理角色 */public class ConcreteHandler2 extends Handler { @Override public void handlerRequest(String condition) { // 如果是自己的责任,就自己处理,负责传给下家处理 if(condition.equals("ConcreteHandler2")){ System.out.println( "ConcreteHandler2 handled "); return ; }else{ System.out.println( "ConcreteHandler2 passed "); getSuccessor().handlerRequest(condition); } }}
package chainOfResp;/** * *作者:Singit *时间: *描述:具体处理角色 */public class ConcreteHandlerN extends Handler { /** * 这里假设n是链的最后一个节点必须处理掉 * 在实际情况下,可能出现环,或者是树形, * 这里并不一定是最后一个节点。 * */ @Override public void handlerRequest(String condition) { System.out.println( "ConcreteHandlerN handled"); }}
package chainOfResp;/** * *作者:Singit *时间: *描述:测试类 */public class Client { /** *作者:Singit *时间: *描述: */ public static void main(String[] args) { Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); Handler handlern = new ConcreteHandlerN(); //链起来 handler1.setSuccessor(handler2); handler2.setSuccessor(handlern); //假设这个请求是ConcreteHandler2的责任 handler1.handlerRequest("ConcreteHandler2"); }}
package chainOfResp.example;/** * *作者:alaric *时间:2013-8-17下午1:02:51 *描述:审批处理抽象类 */public abstract class Handler { protected Handler handler; /** * *作者:Singit *时间: *描述:审批 */ public abstract boolean approve(double day); public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } }
package chainOfResp.example;public class GroupLeader extends Handler { @Override public boolean approve(double day) { if(day<0.5){ System.out.println("小组长审批通过"); return true; }else { System.out.println("小组长传给了他的上司"); return getHandler().approve(day); } }}
package chainOfResp.example;public class ProjectManager extends Handler { @Override public boolean approve(double day) { if(day<2){ System.out.println("项目经理审批通过"); return true; }else { System.out.println("项目经理传给了他的上司"); return getHandler().approve(day); } }}
package chainOfResp.example;public class DepartmentManager extends Handler { @Override public boolean approve(double day) { if(day<5){ System.out.println("部门经理审批通过"); return true; }else { System.out.println("部门经理传给了他的上司"); return getHandler().approve(day); } }}
package chainOfResp.example;public class CEO extends Handler { @Override public boolean approve(double day) { System.out.println("部门经理审批通过"); return true; }}
package chainOfResp.example;/** * *作者:Singit *时间: *描述:测试类,首先来创建责任链,然后发出请求模拟员工来请假 */public class Client { /** *作者:alaric *时间:2013-8-17下午12:54:44 *描述: */ public static void main(String[] args) { //创建节点 GroupLeader gl = new GroupLeader(); ProjectManager pm = new ProjectManager(); DepartmentManager dm = new DepartmentManager(); CEO ceo = new CEO(); //建立责任链 gl.setHandler(pm); pm.setHandler(dm); dm.setHandler(ceo); //向小组长发出申请,请求审批4天的假期 gl.approve(4D); }}运行结果:
五、小结(优点与缺点)
优点:因为无法预知来自外界(客户端)的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。
1、对于每一个请求都需要遍历职责链,性能是个问题;效率低,因为一个请求的完成可能要遍历到最后才可能完成;扩展性差,因为在COR中,一定要有一个统一的接口处理程序局限性就在这里。
2、抽象处理者 AbstractHandler 类中的 handleRequest() 方法中使用了递归,栈空间的大小也是个问题。 个人看法: 职责链模式对于请求的处理是不知道最终处理者是谁,所以是运行动态寻找并指定;而命令模式中对于命令的处理时在创建命令是已经显式或隐式绑定了接收者。六、总结:
纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。 在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。 责任链模式在Tomcat中的应用 众所周知Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。
转载地址:http://srusi.baihongyu.com/