- 浏览: 172759 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
String.intern()在全局常量池1.8在native ...
Java 内存模型 -
lgh1992314:
try with resource
Java GC的过程 -
lgh1992314:
JDK8 HotSpot 方法区在MetaSpace
Java 内存模型 -
空城回转:
永洁童心 写道最后的图中,在afterload_1步骤中,op ...
栈帧、局部变量表、操作数栈 -
永洁童心:
最后的图中,在afterload_1步骤中,operand s ...
栈帧、局部变量表、操作数栈
1.定义:
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式是一种对象的行为模式。
2.通用代码
这个模式很简单,也许看完通用代码就能理解了:
package _10ChainOfResponsibility; public abstract class Handler { private Handler nextHandler; public final void service(String request) { // 判断自己能否提供服务,如果不能,将任务提交给下一个处理者 if(this.canIService()) { this.realService(); }else{ if(null != nextHandler) { // 将任务提交给下一个处理者 nextHandler.service(request); }else{ // 我没权限处理,又找不到我的上级,不知道该怎么办了 } } } public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } // 根据一定条件判断我能否提供服务 protected abstract boolean canIService(); // 真正的服务方法 protected abstract void realService(); }
3.责任链模式的两个角色
- 抽象处理者(Handler)角色: 定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。Handler类的聚合关系给出了具体子类对下家的 引用,抽象方法service()规范了子类处理请求的操作。
- 具体处理者(ConcreteHandler)角色: 具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
4.使用场景
来考虑这样一个功能:申请聚餐费用的管理。
很多公司都是这样的福利,就是项目组或者是部门可以向公司申请一些聚餐费用,用于组织项目组成员或者是部门成员进行聚餐活动。
申请聚餐费用的大致流程一般是:由申请人先填写申请单,然后交给领导审批,如果申请批准下来,领导会通知申请人审批通过,然后申请人去财务领取费用,如果没有批准下来,领导会通知申请人审批未通过,此事也就此作罢。
不同级别的领导,对于审批的额度是不一样的,比如,项目经理只能审批500元以内的申请;部门经理能审批1000元以内的申请;而总经理可以审核任意额度的申请。
也就是说,当某人提出聚餐费用申请的请求后,该请求会经由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求。
可以使用责任链模式来实现上述功能:当某人提出聚餐费用申请的请求后,该请求会在 项目经理—〉部门经理—〉总经理
这样一条领导处理链上进行传递,发出请求的人并不知道谁会来处理他的请求,每个领导会根据自己的职责范围,来判断是处理请求还是把请求交给更高级别的领导,只要有领导处理了,传递就结束了。
需要把每位领导的处理独立出来,实现成单独的职责处理对象,然后为它们提供一个公共的、抽象的父职责对象,这样就可以在客户端来动态地组合职责链,实现不同的功能要求了。
下面来看用责任链模式实现的上述功能:
package _10ChainOfResponsibility; public abstract class FeeHandler { private FeeHandler nextHandler; public final boolean handleFeeRequest(int fee) { // 判断自己是否有资格审批,如果不能,将任务提交给上级处理 if(this.canIService(fee)) { this.realService(fee); }else{ if(null != nextHandler) { // 将任务提交给上级 return nextHandler.handleFeeRequest(fee); } } return false; } public void setNextHandler(FeeHandler nextHandler) { this.nextHandler = nextHandler; } // 根据金额判断我能否审批 protected abstract boolean canIService(int fee); // 真正的审批方法 protected abstract void realService(int fee); }
package _10ChainOfResponsibility; //项目经理 public class ProjectManagerHandler extends FeeHandler { @Override protected boolean canIService(int fee) { if(fee > 500) { System.out.println(fee+"元,项目经理没权限审批"); return false; } return true; } @Override protected void realService(int fee) { System.out.println(fee+"元,项目经理批了"); } }
package _10ChainOfResponsibility; // 部门经理 public class DeptManagerHandler extends FeeHandler { @Override protected boolean canIService(int fee) { if(fee > 1000) { System.out.println(fee+"元,部门经理没权限审批"); return false; } return true; } @Override protected void realService(int fee) { System.out.println(fee+"元,部门经理批了"); } }
package _10ChainOfResponsibility; //总经理 public class GeneralManagerHandler extends FeeHandler { @Override protected boolean canIService(int fee) { // 总经理就是牛,多少金额都能批 return true; } @Override protected void realService(int fee) { System.out.println(fee+"元,总经理批了"); } }
package _10ChainOfResponsibility; public class Client { /** * @param args */ public static void main(String[] args) { ProjectManagerHandler pmh = new ProjectManagerHandler(); DeptManagerHandler dmh = new DeptManagerHandler(); GeneralManagerHandler gmh = new GeneralManagerHandler(); pmh.setNextHandler(dmh); dmh.setNextHandler(gmh); System.out.println("张三找PM报销餐费300"); pmh.handleFeeRequest(300); System.out.println("张三找PM报销餐费600"); pmh.handleFeeRequest(600); System.out.println("张三找PM报销餐费2000"); pmh.handleFeeRequest(2000); } }
300元,项目经理批了
张三找PM报销餐费600
600元,项目经理没权限审批
600元,部门经理批了
张三找PM报销餐费2000
2000元,项目经理没权限审批
2000元,部门经理没权限审批
2000元,总经理批了
5.纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。
6.责任链模式的优点
责任链模式非常显著的优点是将请求和处理分开。请求者可以不知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。
7.责任链模式的缺点
责任链模式有两个非常显著的缺点:
- 一是性能问题,每个请求都要从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。
- 二是调试不方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑比较复杂。
8.责任链模式的注意事项
责任链中节点数量需要控制,避免出现超长链的情况,一般的做法是在Handler中设置一个最大节点数量,在setNext方法中判断是否已经超过了其阀值,超过则不允许该链建立,避免无意识地破坏系统性能。
9.实际使用示例
众所周知Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。
public class TestFilter implements Filter{ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(request, response); } public void destroy() { } public void init(FilterConfig filterConfig) throws ServletException { } }
发表评论
-
设计模式代码-仅供参考
2012-11-26 17:13 819学完设计模式,示例代码保存着,以后看看。 -
23.桥梁模式(Bridge Pattern)
2012-11-26 17:09 18281.定义 将抽象和实现解耦,使得两者可以独立地变化 ... -
22.享元模式(Flyweight Pattern)
2012-11-26 14:55 14161.定义 使用共享对象可有效地支持大量的细粒度的对象。 是 ... -
21.解析器模式(Interpreter Pattern)
2012-11-23 14:29 45411.定义 给定一门语言,定义它的文法的一种表示,并定义一个解 ... -
20.状态模式(State Pattern)
2012-11-22 14:02 13081.定义 当一个对象内在状态改变时,允许其改变行为,这个对象 ... -
19.访问者模式(Visitor Pattern)
2012-11-19 16:28 1940话说有一个银行,有三 ... -
18.备忘录模式(Memento Pattern)
2012-11-16 15:01 1063引子 俗话说:世上难 ... -
17.门面模式(FacadePattern)
2012-11-15 15:23 10441.定义 要求一个子系统 ... -
16.观察者模式(ObserverPattern)
2012-11-14 16:08 15511.定义 定义对象之间一种一对多的依赖关系,使得每当一个对象 ... -
15.组合模式(Composite Pattern)
2012-11-13 17:35 18011.定义 将对象组合成树形结构以表示“部分-整体”的层次结构 ... -
14.迭代器模式(Iterator Pattern)
2012-11-13 14:27 11771.定义 提供一种方法访 ... -
13.适配器模式(Adapter Pattern)
2012-11-12 17:24 13511.定义 将一个类的接口变换成客户端所期待的另一种接口,从而 ... -
12.策略模式(Strategy Pattern)
2012-11-12 13:51 11211.定义 定义一组算法,将每个算法都封装起来,并且使它们之间 ... -
11.装饰模式(Decorator Pattern)
2012-11-08 15:57 10491.定义 动态地给一个对 ... -
9.命令模式(Command Pattern)
2012-11-07 14:45 10051.定义 将一个请求封装 ... -
8.中介者模式(Mediator Pattern)
2012-11-01 15:57 15241.定义: 用一个中介对象封装一系列的对象交互,中介者使个对 ... -
7.原型模式(Prototype Pattern)
2012-11-01 10:54 13271.定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原 ... -
6.代理模式(Proxy Pattern)
2012-10-30 16:09 11321.定义: 为其他对象提供一种代理以控制这个对象的访问。 ... -
5.建造者模式(Builder Pattern)
2012-10-26 17:06 10291.定义: 将一个复杂对象的构建与它的表示分离,使得同样的构 ... -
4.模板方法模式(Template Method Pattern)
2012-10-25 16:33 1160定义: 定义一个操作中的算法的框架,而将一些步骤延迟到 ...
相关推荐
设计模式C++学习之责任链模式(Chain of Responsibility)
C#面向对象设计模式 Chain of Responsibility 职责链模式 视频讲座下载
23种设计模式之二十一(行为模式)Chain of Responsibility模式
【Java设计模式】(3)责任链Chain of Responsibility源码
C#面向对象设计模式 (行为型模式) Chain Of Responsibility 职责链模式 视频讲座下载
NULL 博文链接:https://stelin.iteye.com/blog/932101
责任链模式(Chain of Responsibility Pattern)是一种常见的行为模式。 使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链一直传递该请求,直到有...
NULL 博文链接:https://linkcqu.iteye.com/blog/355806
C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式
chain of responsibility 职责链模式(行为模式)来自于Microsoft官方网站视频教程,详细介绍了职责链模式的运用,且在本人提供的资源里可以下载到相关的PDF辅助文档帮助
chain-of-responsibility-demo 责任链模式demo
主要介绍了Java设计模式之责任链模式(Chain of Responsibility模式)介绍,本文讲解了如何使用责任链模式,并给出了4种使用实例,需要的朋友可以参考下
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) (Level 300)
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式)
Chain Of Responsibility.rar
责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 在处理用户的...
创建型: 1. 单件模式(Singleton ... 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern) @Author kwming
C#设计模式(23种设计...19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)