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

一:责任链模式的定义
        --->使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
        --->责任链模式的重点是在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果
        --->一般会有一个封装类对责任模式进行封装,也就是替代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 }

View Code

【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 }

View Code

【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 }

View Code

【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 }

View Code

【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 }

View Code

【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 }

View Code

 

时间: 2024-10-24 02:05:54

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

设计模式(九)之责任链模式

今天来讲一个悲伤的故事,关于小明找小红的故事.加班狗小明某日不用加班,开开心心把家还,结果妻子小红不在家,发生了下面的一幕: 上代码.首先定义好小红 public interface Lover { } 小红: public class WifeHong implements Lover { public WifeHong(Affairs affairs) { System.out.println("我是小红,去" + affairs.name + "家."); a

详解java设计模式之责任链模式

从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 假比说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图).当鼓声停止时,手中有花的人就得执行酒令. 图1.击鼓传

PHP设计模式之责任链模式的深入解析_php技巧

责任链模式,其目的是组织一个对象链处理一个如方法调用的请求.当ConcreteHandler(具体的处理程序)不知道如何满足来自Client的请求时,或它的目的不是这个时,它会委派给链中的下一个Handler(处理程序)来处理. 这个设计模式通常和复合模式一起使用,其中有些叶子或容器对象默认委派操作给它们的父对象.另一个例子是,本地化通常是使用责任链处理的,当德语翻译适配器没有为翻译关键词找到合适的结果时,就返回到英语适配器或干脆直接显示关键词本身. 耦合减少到最低限度:Client类不知道由哪

实例讲解Java的设计模式编程中责任链模式的运用_java

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

Java设计模式编程中的责任链模式使用示例_java

责任链模式:多个对象由其对象对应下家的引用连成一条链,请求在这个链上传递,直到 链上的某一个接收对象处理此请求.因为请求的客户端并不知道链上最终是谁来处理这个请求,使得系统可以在不影响客户端的情况下动态地重新组织和分配责任, 从而避免了请求发送者与请求处理者之间的耦合. 责任链械中涉及到三种角色: 1,抽象处理者角色 2,具体处理者角色 3,请求发送者 小例子:假设去买房子,买房子就需要砍价, 卖房的人职位不同,可以优惠的价格也不同,不同职位就可以形成一个处理请求的链.我们暂定: * 基层销售员

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

 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止. 责任链模式的角色: 1. 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现.上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handlerRequest()规范了子类处理请求的操作. 2. 具体处理者角色(Co

乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) 作者:webabcd 介绍 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它. 示例 有一个Message实体类,某个类对它的操作有Insert()方法.现在要求根据插

详解C++设计模式编程中责任链模式的应用_C 语言

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 其思想很简单,比如考虑员工要求加薪.公司的管理者一共有三级,总经理.总监.经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监.总监的处理方式也一样,总经理可以处理所有请求.这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求.给出这个例子的UML图.

Java设计模式之责任链模式简介_java

对于使用过宏的朋友应该知道,利用宏可以实现一个键绑定多个技能.例如如果排在前面的技能有CD,则跳过此技能,执行之后的技能.记得曾经玩DK,打怪的时候,就是用一个键,一直按就行了.在servlet里的doGet和doPost方法,我们一般都把doGet请求发动到doPost里来处理,这也是一种责任链的模式. 这里,有个宏,绑定了"冰血冷脉"和"寒冰箭"两个技能,程序实例如下所示: package responsibility; /** * DOC 技能接口,要绑定的技