`
liuluo129
  • 浏览: 116310 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

责任链——Chain of Responsibility

阅读更多

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

责任链模式涉及到的角色如下所示:

Ø  抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。下图中的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

Ø  具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。


 

代码如下:

Handler抽象类:

public abstract class Handler {
    protected Handler sucessor;

    public abstract void handleRequest(Request req);
    getter...setter
}

 Handler具体实现子类: 

public class ConcreteHandler1 extends Handler {
    @Override  
    public void handleRequest(Request  condition) {
        // 如果是自己的责任,就自己处理,负责传给下家处理  
        if(condition.getReqStr().equals("ConcreteHandler1")){
            System.out.println( "ConcreteHandler1 handled ");  
            return ;  
        }else{  
            System.out.println( "ConcreteHandler1 passed ");  
            this.getSucessor().handleRequest(condition);
        }  
    }  
}

 另一个实现类:

public class ConcreteHandler2 extends Handler {   
    @Override  
    public void handleRequest(Request condition) {
        // 如果是自己的责任,就自己处理,负责传给下家处理  
        if(condition.getReqStr().equals("ConcreteHandler2")){
            System.out.println( "ConcreteHandler2 handled ");  
            return ;  
        }else{  
            System.out.println( "ConcreteHandler2 passed ");  
            getSucessor().handleRequest(condition);
        }  
    }  
} 

 客户端调用:

Handler handler1 = new ConcreteHandler1();  
Handler handler2 = new ConcreteHandler2();    
  
//链起来  
handler1.setSucessor(handler2);
  
//假设这个请求是ConcreteHandler2的责任
Request request = new Request();
request.setReqStr("ConcreteHandler2");
handler1.handleRequest(request);

 运行结果如下:

ConcreteHandler1 passed 

ConcreteHandler2 handled 

上面简单的例子是根据请求信息来进行过滤,当是自己需要处理的请求时过滤器处理并返回。另外一种是过滤器先处理,再判断是否还有下一个过滤器,有则再交给下一个过滤器。

public void handleRequest(Request  condition) {
    System.out.println("过滤器先处理");
    if (this.getSucessor() != null) {
        this.getSucessor().handleRequest(condition);
    }
  System.out.println("过滤器处理完毕");
}

 纯的与不纯的责任链模式

一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,二是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。

在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。

纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大的意义了。

  • 大小: 16 KB
分享到:
评论

相关推荐

    【Java设计模式】(3)责任链Chain of Responsibility

    **Java设计模式——责任链(Chain of Responsibility)** 在软件工程中,设计模式是一种解决常见问题的可重用解决方案。责任链模式是行为设计模式之一,它的主要思想是将请求的发送者和接收者解耦,通过将多个处理...

    设计模式C#实例——大洋系统

    "设计模式C#实例——大洋系统"这个主题涵盖了五个经典的设计模式:抽象工厂(Abstract Factory)、适配器(Adapter)、桥接(Bridge)、建造者(Builder)以及责任链(Chain of Responsibility)。接下来,我们将...

    Python设计模式之职责链模式原理与用法实例分析

    职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接收者的耦合关系。将对象连成链并沿着这条链传递请求直到被处理 下面是一个设计模式的demo: #!/usr/bin/env python # -*- ...

    设计模式代码——c#

    C#设计模式(23种设计...19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    设计模式——职责链源码(C++)

    在软件设计中,职责链(Chain of Responsibility)模式是一种行为设计模式,它允许将请求沿着处理者对象的链式结构传递,直到某个对象能够处理它为止。这种模式提供了一种方式来避免请求发送者与接收者之间的耦合,...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    3. **行为型模式**:包括策略(Strategy)、模板方法(Template Method)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、责任链(Chain of Responsibility)、命令(Command)、备忘录(Memento)、...

    深入理解JavaScript系列(38):设计模式之职责链模式详解

    职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。 也就是说,请求...

    X-gen PPT下载——《研磨设计模式》 实战

    3. **行为型模式**:包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式...

    软件设计与体系结构实验二 设计模式(代码与文档).zip

    行为型模式如观察者(Observer)、策略(Strategy)和责任链(Chain of Responsibility),它们关注于对象之间的交互和行为。 "文档.md"可能包含了实验指导、模式解释以及代码实现的详细说明。在实验中,你可能会...

    UML面向对象设计与分析基础教程课件第八章

    例如,借阅图书的操作流程可以使用责任链 (Chain of Responsibility ,COR) 设计模式实现。责任链设计模式是一种可用于计多具体领域的行为模式,该模式用于处理一组对象和一个请求之间的关系,当一个请求可以被多个...

    Headfirst 文字版

    行为型模式如观察者(Observer)、策略(Strategy)和责任链(Chain of Responsibility),关注对象间如何交互和执行任务。 《Head First 设计模式》不仅介绍了这些模式的基本原理,还提供了大量实例来展示如何在...

    设计模式在Drawcli程序中的应用

    本篇文章将通过Drawcli程序来探讨三种常用的设计模式:Prototype(原型)、Observer(观察者)和Chain of Responsibility(责任链)。 #### 2. Drawcli中使用的设计模式 ##### 2.1 Prototype(原型) **Prototype...

    c#设计模式随书源码

    行为型模式则涉及对象间职责的分配和交互,如观察者(Observer)、命令(Command)和责任链(Chain of Responsibility)模式,这些模式提供了处理行为和通信的方法。 在"Programs"这个压缩包文件中,可能包含了各种...

    design-pattern-java.pdf

    十一个行为型模式 十一个行为型模式 职责链模式-Chain of Responsibility Pattern 请求的链式处理——职责链模式(一) 请求的链式处理——职责链模式(二) 请求的链式处理——职责链模式(三) 请求的链式处理——...

    非常好的设计模式资料

    3. **行为型模式**:如责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、访问者(Visitor)、中介者(Mediator)、备忘录(Memento)、观察者(Observer)、状态...

    设计模式大全C++

    3. **行为型模式**:这一类模式主要关注对象之间的交互和职责分配,如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、责任链(Chain of Responsibility)、命令(Command)、迭代器(Iterator...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)_《0528》.rar

    行为型模式则关注对象之间的交互和职责分配,如策略模式(Strategy)、观察者模式(Observer)和责任链模式(Chain of Responsibility)等,它们有助于提高代码的灵活性和可扩展性。 在C#中,设计模式的实现往往...

    设计模式设计模式设计模式

    行为型模式则关注对象间的交互和职责分配,包括责任链模式(Chain of Responsibility)、观察者模式(Observer)、命令模式(Command)等。这些模式帮助我们更好地处理对象之间的通信,让代码更具可读性和可维护性。...

    设计模式-可复用面向对象软件的基础

    其中包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

Global site tag (gtag.js) - Google Analytics