java责任链设计模式及在tomca容器中的应用,第一部分
2016-06-27 15:53
591 查看
责任链模式简介
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。责任链模式涉及到的角色如下所示:
● 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
● 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
示例
1.简单案例:抽象处理者角色
package sjms.zrl.simple; public abstract class Handler { /* * 持有后继的责任对象 */ protected Handler successor; /* * 示意处理请求的方法,此方法可以设置参数 */ public abstract void handleRequest(); /* * 取值方法 */ public Handler getsuccessor(){ return successor; } /* * 赋值方法,设置后继的责任对象 */ public void setsuccessor(Handler successor){ this.successor=successor; } }
具体处理者角色
package sjms.zrl.simple; public class ConcreateHandler extends Handler{ /* * 处理方法,调用此方法处理请求 */ @Override public void handleRequest() { // TODO Auto-generated method stub if(getsuccessor()!=null) { System.out.println(this.getClass().getSimpleName()+"交给下一位处理!"); getsuccessor().handleRequest(); }else{ System.out.println("已经处理"); } } }
测试
package sjms.zrl.simple; public class Client { public static void main(String[] args) { //组装责任链 Handler handler1 = new ConcreateHandler(); Handler handler2 = new ConcreateHandler(); handler1.setsuccessor(handler2); //处理请求 handler1.handleRequest(); } }
复杂示例,员工报销
抽象处理这角色
package sjms.zrl.complex; public abstract class Handler { /* * 持有下一个处理请求的对象 */ protected Handler successor=null; /* * 获取下一个负责处理请求的对象 */ public Handler getsuccessor(){ return successor; } /* *设置下一个负责处理请求对象 */ public void setsuccessor(Handler successor){ this.successor=successor; } /* * 处理费用申请 */ public abstract String dorequest(String user,double fee); }
三个具体处理这角色,项目经理,部门经理,总经理
package sjms.zrl.complex; public class ProjectManager extends Handler { @Override public String dorequest(String user, double fee) { // TODO Auto-generated method stub String str=""; //项目经理权限较小,只能处理500元一下的 if(fee<500){ //为了简单处理,只能处理张三的请求 if("张三".equals(user)){ str="成功:项目经理同意【"+user+"】"+"的请客费用,金额:"+fee+"元"; }else{ //其他人一律不同意 str = "失败:项目经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元"; } }else{ //超过500就交给部门领导处理 if(getsuccessor()!=null) return getsuccessor().dorequest(user, fee); else return "请求异常,请检查"; } return str; } } ************** package sjms.zrl.complex; public class DeptManager extends Handler { @Override public String dorequest(String user, double fee) { // TODO Auto-generated method stub String str=""; //部门经理权限较大,能处理1000元一下的 if(fee<1000){ //为了简单处理,只能处理张三的请求 if("张三".equals(user)){ str="成功:部门经理同意【"+user+"】"+"的请客费用,金额:"+fee+"元"; }else{ //其他人一律不同意 str = "失败:部门经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元"; } }else{ if(getsuccessor()!=null) return getsuccessor().dorequest(user, fee); else return "请求异常,请检查"; } return str; } } ************** package sjms.zrl.complex; public class GeneralManager extends Handler { @Override public String dorequest(String user, double fee) { // TODO Auto-generated method stub String str=""; //总经理权限较大,只能处理10000元一下的 if(fee>=1000){ //为了简单处理,只能处理张三的请求 if("张三".equals(user)){ str="成功:总经理同意【"+user+"】"+"的请客费用,金额:"+fee+"元"; }else{ //其他人一律不同意 str = "失败:总经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元"; } }else{ //超过1000就交给总领导处理 if(getsuccessor()!=null) return getsuccessor().dorequest(user, fee); else return "请求异常,请检查"; } return str; } }
测试
package sjms.zrl.complex; public class Client { public static void main(String[] args) { //先组装责任链 Handler xmjl = new ProjectManager(); Handler bmjl = new DeptManager(); Handler zjl = new GeneralManager(); xmjl.setsuccessor(bmjl); bmjl.setsuccessor(zjl); //开始测试 String test1 = xmjl.dorequest("张三", 300); System.out.println("test1 = " + test1); String test2 = xmjl.dorequest("李四", 300); System.out.println("test2 = " + test2); System.out.println("---------------------------------------"); String test3 = xmjl.dorequest("张三", 700); System.out.println("test3 = " + test3); String test4 = xmjl.dorequest("李四", 700); System.out.println("test4 = " + test4); System.out.println("---------------------------------------"); String test5 = xmjl.dorequest("张三", 1500); System.out.println("test5 = " + test5); String test6 = xmjl.dorequest("李四", 1500); System.out.println("test6 = " + test6); } }
第二部分:http://blog.csdn.net/fengzijinliang/article/details/51768831
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用