设计模式-责任链模式

1 模式动机

为了降低系统的耦合度,将事件请求者和接收者解耦,我们可以使用命令模式来设计系统。通过增加不同的命令对象,不仅可以解耦,也可以有效解决发送和接收处理速度不一样的问题。

2 模式定义

责任链模式(Chain of Responsibility Pattern):将多个对象连成一条链,沿着这条链传递请求,直到有一个对象处理它为止,使得多个对象都有机会处理该请求。

3 模式分析

Handler处理者接口:

声明处理请求的接口。

ConcreteHandler具体处理者类:

实现处理请求的接口,指定下一处理者。

Client:

调用客户。

类图如下所示:

4 实例演示

 1 package com.pattern.responsibility;
 2
 3 public abstract class Handler {
 4     public Handler successor = null;
 5
 6     public abstract boolean canHandle();
 7
 8     public abstract void handle();
 9
10     public void handleRequest() {
11         if(canHandle()) {
12             handle();
13         } else {
14             getSuccessor().handleRequest();
15         }
16     }
17
18     public Handler getSuccessor() {
19         if(successor==null) {
20             successor = new EmptyHandler();
21         }
22         return successor;
23     }
24
25     public void setSuccessor(Handler successor) {
26         this.successor = successor;
27     }
28 }
 1 package com.pattern.responsibility;
 2
 3 public class CommonHandler extends Handler {
 4     @Override
 5     public boolean canHandle() {
 6         // 是否可以处理请求
 7         System.out.println("Common not handle...");
 8         return false;
 9     }
10
11     @Override
12     public void handle() {
13         System.out.println("Common handle...");
14     }
15 }
 1 package com.pattern.responsibility;
 2 public class SpecialHandler extends Handler {
 3     @Override
 4     public boolean canHandle() {
 5         // 具体handler实现
 6         System.out.println("Special not handle...");
 7         return false;
 8     }
 9
10     @Override
11     public void handle() {
12         System.out.println("Special handle...");
13     }
14 }
 1 package com.pattern.responsibility;
 2
 3 public class ExtendHandler extends Handler {
 4     @Override
 5     public boolean canHandle() {
 6         // 是否可以处理请求
 7         return true;
 8     }
 9
10     @Override
11     public void handle() {
12         System.out.println("Extend handle...");
13     }
14 }
 1 package com.pattern.responsibility;
 2
 3 public class EmptyHandler extends Handler {
 4     @Override
 5     public boolean canHandle() {
 6         // 是否可以处理请求
 7         return true;
 8     }
 9
10     @Override
11     public void handle() {
12         // TODO Auto-generated method stub
13     }
14 }
 1 package com.pattern.responsibility;
 2
 3 public class Client {
 4     public static void main(String args[]) {
 5         CommonHandler commonHandler = new CommonHandler();
 6         SpecialHandler specialHandler = new SpecialHandler();
 7         ExtendHandler extendHandler = new ExtendHandler();
 8
 9         commonHandler.setSuccessor(specialHandler);
10         specialHandler.setSuccessor(extendHandler);
11
12         commonHandler.handleRequest();
13     }
14 }

5 纯责任链与不纯责任链

纯责任链:

1 当handler能处理请求时,停止调用下一个handler。当handler不能处理请求时,继续调用下一个handler。只能在两个行为中选择一个,一是承担责任,二是把责任推给下家。

(好比男人要么做个有责任感的人,要么做个推卸责任的人)

2 一个请求必须被某一个处理者对象接收。

例如:工厂产品的质量检查流水线,如果出现问题,就直接将产品拿出来。如果通过检查,则传递给下一个检查员。

不纯责任链:

1 承担一部分责任又把责任传到下一个处理者(好比工厂的流水线,每处理完一道工序,交给下一个人处理)。

2 一个请求可以不被任何处理者接收。

例如:工厂产品的生产流水线,每个人都会处理一部分,然后交给下一个人。

6 优缺点

优点:

1 可以灵活方便的将处理者连接成一条链,满足不同的需求。

2 将请求者与处理者解耦,提高灵活性。

缺点:

1 与if...else...缺点一样,在找到正确逻辑处理前,要遍历每一个逻辑判断,当责任链的对象过多时,会影响性能。

7 适用环境

1 有多个对象可以处理同一请求,处理请求的时机可以放在运行时确定。

8 总结

1 责任链模式最大的好处:可以根据需求组织对应的责任链处理请求,调用某个处理者即可,不用知道它内部的实现(它可以自己处理,也可以委托其它处理者处理)。

9 问题

1 为什么不将处理器组成一个List,然后按顺序处理请求?

这样请求可能被处理多次,在某些业务场景是不合适的(比如付款单发给多个付款者,则会发生多次付款)。这些场景处理者处理完毕后,不需要下一个处理者接着处理,这样就不能用列表,而是通过责任链处理,当不需要往下传递时,马上终止处理。

2 责任链模式最可能在什么场景下使用?

当业务逻辑中包含多个if、else分支,代码看上去很糟糕时,可以考虑使用责任链模式将条件判断逻辑分散到多个处理者对象中。

时间: 2024-08-25 00:36:50

设计模式-责任链模式的相关文章

java 设计模式 -- 责任链模式

设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪个对象处理,这使得我们能够动态的添加链上的对象而且分配责任. 纯责任链和非纯责任链 责任链分为两种.纯责任链和非纯责任链. 纯责任链是待处理对象request在处理对象handler链上传递,每一个处理对象handler处理request的一部分,到终于处理完毕.非纯责任链则是待处理对象reques

[设计模式] 责任链模式之变种 - 责任链子

今天看到 wikipedia 的责任链模式,好奇之下搜寻相关文章,此文章主要参考 91大的 [.NET]重构之路系列v11 –用责任链模式打破讨厌的switch case 的变种作法,所以跟原本的责任链模式的设计思路不太相同,但结果相同, 所以阅读前,建议先看完91大的文章后,在来看这篇会比较能感觉出差异. ?这边先引用91大文章结尾结论中的补充来复习一下责任链的重点, 20120415 补充:责任链的用意在于把每个角色的职责分清楚,每个对象只需要做好自己的事,透过责任链的方式来组合,并完成使用

24天学会设计模式------责任链模式

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka/article/details/43210027 一.责任链模式(Chain of Responsibility Pattern) 1.简介 从名字上大概也能猜出这个模式的大概模样--系统中将会存在多个有类似处理能力的对象.当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的"责任"对象,并进行处理.<设计模式>中给它的定义如下:使多个对象都有机会处理请

Java与设计模式-责任链模式

责任链模式属于行为型设计模式之一,怎么理解责任链?责任链是可以理解成数个对象首尾连接而成,每一个节点就是一个对象,每个对象对应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模式. 生活中可以找到责任链模式的原型吗?这种例子很多,比如你要去买房子,首先是销售人员(对象1)接待你,你说想要百分之3的折扣,没问题,这时销售人员就有打百分之三折扣的权限,销售人员(对象1)进行处理.这时来了一个土豪,说要买10套,要百分之五的折扣,销售人员(对象1)没有百分之五折扣的权限,必须要想上

我的Java设计模式-责任链模式

今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯洁化身的我做这种需求,还露点. 产品经理:误会误会,是放一张暴露一点点的,尺寸不大. 小猿:尼玛~能说清楚些吗,需求模棱两可的.不干,我要上报boss. 产品经理也一阵无语,这豆丁的事还上报boss.话说这上报也得走程序是吧,技术经理就不干了,"凭什么要跳过我,得经过我才能到boss".咦

设计模式-责任链模式在实际项目中的使用

最近一次迭代,参与了公司数据应用平台的开发,其中负责的一块功能早早的就完成了代码的编写工作,即将进入测试阶段,因为有时间思考和总结代码编写中遇到的难题,便想着将代码做一次重构:其中优化的一个功能就是关于数据平台敏感字段的收集 功能描述:数据平台敏感字段的收集: 提供 service 方法,查询是否需要扫描表做触发式收集,指定具体实例与库的表,随机取 N 行(1~max(id) 之间):a.对每一行的每一个字段的值(取非 null 非空的值)做正则匹配 b. 对每一行的每一个字段的值看是否包含了敏

24种设计模式--责任链模式【Chain ofResponsibility Pattern】

中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女的要出去逛街,同样这样的一个请求,在她没有出嫁前她必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?一般都是男的比女的死的早,还要问问儿子是否允许自己出去逛街,估计你下边马上要问要是没有儿子怎么办?请示小叔子.侄子等等,在父系社会中,妇女只占从属地位,现在想想中国的妇女还是比较悲惨的

设计模式 -- 责任链模式或者叫职责链模式(Chain of Responsibility(CoR))

什么是链?前后相连,一个连接下一个,其中包括多个节点,其实责任链模式也类似,他是多个对象之间相互关联,下一个对象的操作由上一个对象关联下来,上一个对象有个方法用于指向其他对象.职责链之间的前后关系是可以改变的,主要看上一节点主要指向哪个节点. android中事件分发就是责任链模式的具体表现: View的ontouchEvent返回值设置,如果为true,交个自己的消费事件的方法去处理,如果为false,则继续向下一个进行传递. 如何实现责任链模式: 比如责任链上有,A,B,C三个对象,如果A有

java设计模式--责任链模式

责任链模式:将能够处理同一类请求的对象连成一条链,如果不能处理则传递给链上的下一个对象. //请假对象 public class QingjiaRequest { private String name; private int days; private String reason; public QingjiaRequest(String name, int days, String reason) { this.name = name; this.days = days; this.rea

设计模式——责任链模式

责任链模式:将能够处理同一类请求的对象连成一条链所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求, 如果能则处理,如果不能则传递给链上的下一个对象.优点:将请求者和发送者解耦         简化对象的处理过程         可以通过改变链中的成员或成员的顺序来动态的新增或则删除责任. 缺点:不能保证请求一定会执行,可能或落到责任链之外. 不容易观察运行时的特征,处理请求的方法比较分散.实现方式:链表和非链表两种实现,但是使用集合和数组等非链表实现在实际开发中更方便更常用. 应用