设计模式之禅之设计模式-责任链模式

一:责任链模式的定义
        --->使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
        --->责任链模式的重点是在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果
        --->一般会有一个封装类对责任模式进行封装,也就是替代Client类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了高层次模块的调用,减少模块间的耦合,提高系统的灵活性。

二:责任链模式的应用
        
         ●责任链模式的优点
                责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌(例如在J2EE项目开发中,可以剥离出无状态Bean由责任链处理),两者解耦,提高系统的灵活性。

●责任链模式的缺点
                责任链有两个非常显著的缺点:一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。二是调试不很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。

三:责任链模式的注意事项
       ● 链中节点数量需要控制,避免出现超长链的情况,一般的做法是在Handler中设置一个最大节点数量,在setNext方法中判断是否已经是超过其阈值,超过则不允许该链建立,避免无意识地破坏系统性能。
       ● 作为请求者可以不用知道到底是需要谁来处理的,这是责任链模式的核心,同时责任链模式也可以作为一种补救模式来使用

四:责任链模式的实战
          ●在责任链模式中一个请求发送到链中后,前一节点消费部分消息,然后交由后续节点继续处理,最终可以有处理结果也可以没有处理结果,读者可以不用理会什么纯的、不纯的责任链模式
        ●这里也用到模板方法模式,在模板方法中判断请求的级别和当前能够处理的级别,如果相同则调用基本方法,做出反馈;如果不相等,则传递到下一个环节,由下一环节做出回应,如果已经达到环节结尾,则直接做不同意处理。

五:责任链模式的例子

【1】责任链模式的链条抽象类

 1 package com.yeepay.sxf.template11;
 2 /**
 3  * 责任链条接口
 4  * @author sxf
 5  *
 6  */
 7 public abstract class Handler {
 8     //下一个处理者
 9     private Handler nextHandler;
10
11
12     //责任链条
13     public final Response handleMessage(Request request){
14         Response response=null;
15         //判断处理等级
16         if(this.getLeve().equals(request.getLeve())){
17             //处理级别相符
18             response=this.echo(request);
19         }else{
20             //不属于的处理级别
21             //判断是否有下一个处理者
22             if(this.nextHandler!=null){
23                 response=this.nextHandler.handleMessage(request);
24             }else{
25                 //没有适当处理者,业务自行处理
26             }
27         }
28
29         return response;
30     }
31
32     //获取当前处理者的处理等级
33     protected abstract String getLeve();
34     //每个处理者都必须实现处理任务
35     protected abstract Response echo(Request request);
36     //设置下一个处理者
37     public void setNext(Handler handler){
38         this.nextHandler=handler;
39     }
40 }

【2】责任链模式的请求包装

 1 package com.yeepay.sxf.template11;
 2 /**
 3  * 请求的封装
 4  * @author sxf
 5  *
 6  */
 7 public class Request {
 8     //请求的等级
 9     private String leve;
10     //请求内容
11     private String requestContext;
12
13     //有参数的构造
14     public Request(String leve, String requestContext) {
15         super();
16         this.leve = leve;
17         this.requestContext = requestContext;
18     }
19     public String getLeve() {
20         return leve;
21     }
22     public void setLeve(String leve) {
23         this.leve = leve;
24     }
25     public String getRequestContext() {
26         return requestContext;
27     }
28     public void setRequestContext(String requestContext) {
29         this.requestContext = requestContext;
30     }
31
32
33 }

【3】责任链模式的响应包装

 1 package com.yeepay.sxf.template11;
 2 /**
 3  * 响应的结果
 4  * @author sxf
 5  *
 6  */
 7 public class Response {
 8     //响应的内容
 9     private String responseStr;
10
11     public String getResponseStr() {
12         return responseStr;
13     }
14
15     public void setResponseStr(String responseStr) {
16         this.responseStr = responseStr;
17     }
18
19 }

【4】第一个责任者

 1 package com.yeepay.sxf.template11;
 2 /**
 3  * 父亲处理者
 4  * @author sxf
 5  *
 6  */
 7 public class Father extends Handler {
 8     private String  leve="1";
 9
10     //返回处理等级
11     @Override
12     protected String getLeve() {
13
14         return leve;
15     }
16
17     //处理请求
18     @Override
19     protected Response echo(Request request) {
20         System.out.println("Father.echo(父亲已经处理===》)"+request.getRequestContext());
21         Response response=new Response();
22         response.setResponseStr("你的父亲已经处理的请求");
23         return response;
24     }
25
26
27 }

【5】第二个责任者

 1 package com.yeepay.sxf.template11;
 2 /**
 3  * 丈夫处理
 4  * @author sxf
 5  *
 6  */
 7 public class Husband extends Handler{
 8     //丈夫处理等级
 9     private String leve="2";
10
11     //获取处理等级
12     @Override
13     protected String getLeve() {
14         return leve;
15     }
16
17
18     @Override
19     protected Response echo(Request request) {
20         System.out.println("Husband.echo(你的丈夫已经处理你的请求==>)"+request.getRequestContext());
21         Response response=new Response();
22         response.setResponseStr("你的丈夫已经处理你的请求");
23         return response;
24     }
25
26
27
28 }

【6】客户端

 1 package com.yeepay.sxf.template11;
 2
 3 public class ClientTest {
 4
 5     public static void main(String[] args) {
 6         //请求
 7         Request request=new Request("2", "我想出门逛街");
 8         //第一责任人
 9         Handler handler=new Father();
10         //第二责任人
11         Husband husband=new Husband();
12         handler.setNext(husband);
13
14         //找第一责任人处理
15         Response response=handler.handleMessage(request);
16
17         //处理结果
18         System.out.println("ClientTest.main()"+response.getResponseStr());
19     }
20 }

时间: 2024-10-25 19:53:47

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

设计模式之二十:责任链模式(Chain of Responsibility)

感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有机会来处理请求的方式避免了请求的发送者和接收者之间的耦合.将接收者组织成链式的结构这样能够将请求沿着这条链进行传递,直到有接收者对它进行处理. UML类图: 主要包含: Handler:定义了一个处理请求的接口,实现了定义后继者的方法. ConcreteHandler:处理各自负责的请求,假设不能处

从真实项目中抠出来的设计模式——第三篇:责任链模式

一:现实场景 有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给 实体赋值,如果是短信,邮件又是其他方式的赋值,等等此类,这种情况下一般会写出如下if判断,对吧,真实代码如下: 1 if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.邮件)) 2 { 3 //第三步:动态生成邮件模板 4 var styleInfo = Cach

设计模式学习笔记之六:责任链模式

我们公司使用的Enovia PLM系统是基于SOA架构的,PLM不仅仅是SAP的主数据源头,同时还需要跟其他的系统(例如供应商的DAM系统及公司的AS400系统)保持交互,系统跟系统的数据交互通过Web Service基于SOAP来实现,具体来说,PLM需要跟如下系统保持交互: 子系统 地区/功能 AFS1 中国,意大利 AFS2 北美 AS400 遗留系统 DAM 供应商 ISR 零售 PLM发送物料主数据到SAP是通过XML文件这种载体的,SAP有个PF(PI)系统专门读取PLM生成在固定共

设计模式(六):责任链模式

责任链设计模式是行为设计模式之一. 责任链模式用于在软件设计中实现松散耦合,其中来自客户端的请求被传递到对象链以处理它们.然后链中的对象将自己决定谁将处理请求以及是否需要将请求发送到链中的下一个对象. JDK中的责任链模式示例 让我们看一下JDK中责任链模式的例子,然后我们将继续实现这种模式的真实例子.我们知道在try-catch块代码中我们可以有多个catch块.这里每个catch块都是处理该特定异常的处理器. 因此当try块中发生任何异常时,它会发送到第一个catch块进行处理.如果catc

面向对象的设计模式(八),责任链模式

废话不多说,最近要期末考试了,还没预习呢,下面直接进入正题. 定义:定义多个可以处理请求(承担责任)的类,并将它们连成一条链,沿着该链向下传递请求(责任),直到有能力解决问题(承担责任)的类处理之.这使得它们都有机会(看能力大小咯)处理请求. 使用场景: 一个请求有多个类可以处理,但具体由那个类处理要在运行时刻确定: 在请求不知道由谁来处理的时候,可以沿着责任链传递请求: 需要动态指定一组对象处理请求. 优点: 使得请求者和处理者之前关系解耦,提高了代码灵活性. 缺点: 影响程序的性能,尤其在递

设计模式(13)--Chain of Responsibility(责任链模式)--行为型

1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 2.模式特点: 责任链模式通过建立一条链来组织请求的处理者,请求将沿着链进行传递,请求发送者无须知道请求在何时.何处以及如何被处理,实现了请求发送者与处理者的解耦.在软件开发中,如果遇到有多个对象可

设计模式(十二)责任链模式

一.击鼓传花 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客一次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 比如说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,贾赦传给贾政,贾政传给贾宝玉,贾宝玉传给贾环,贾环再传给贾母,由此往复,如下图所示. 击鼓传花便是一种典型的责任链模式. 二.什么是责任链模式 责任

Java设计模式菜鸟系列(十八)责任链模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该请求. 一.uml建模: 二.代码实现 /** * 责任链模式:有多个对象,每个对象持有下一个对象的引用,形成一条链, * * 请求在这条链上传递,直到某一对象决定处理该请求,

iOS设计模式解析(五)责任链模式

责任链模式:使多个对象都有机会处理请求,从而避免发送者和接受者之间发生耦合. 应用场景: 有多个对象可以处理请求,而处理程序只有在运行时才能确定 例如: 英雄联盟中伤害计算,伤害类型分为AP.AD.真实伤害(无视任何防御直接造伤害). 结构分析:整个结构就在这个攻击处理器的抽象.抽象一个属性,下一个处理器(newxHandler).抽象一个方法,处理攻击(handleAttack) 1 -(void)handleAttack:(attack *)attack{ 2 [nextHandler ha

23种设计模式(11):责任链模式

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 类型:行为类模式. 类图: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }else if(i == 3){ Handler