`

CHAIN OF RESPONSIBILITY(职责链) —— 对象行为型模式

 
阅读更多
1、意图
    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之前的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
2、动机
    考虑一个图形用户界面中的上下文有关的帮助机制。用户在界面的任一部分上点击就可以得到帮助信息,所提供的帮助依赖于点击的是界面的哪一部分以及其上下文。例如,对话框中的按钮的帮助信息就可能和主窗口中类似的按钮不同。如果对那一部分界面没有特定的帮助信息,那么帮助系统应该显示一个关于当前上下文的较一般的帮助信息——比如说,整个对话框。
    因此很自然地,应根据普遍性(generality)即从最特殊到最普通的顺序来组织帮助信息。而且,很明显,在这些用户界面对象中会有一个对象来处理帮助请求;至于是哪一个对象则取决于上下文以及可用的帮助具体到何种程度。
    这儿的问题是提交帮助请求的对象(如按钮)并不明确知道是谁是最终提供帮助的对象。我们要有一种办法将提交帮助请求的对象与可能提供帮助信息的对象解耦(decouple)。Chain of Responsibility模式告诉我们应该怎么做。
    这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接收者。该请求沿对项链直至其中的一个对象处理它,如下图所示。


    从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转给链中的下一个候选者。提交请求的对象并不明确地知道哪一个对象将会处理它——我们说该请求有一个隐士接受者(implicit receiver)。
3、适用性
    在以下条件下使用Responsibility链:
    有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    可处理一个请求的对象集合应被动态指定。
4、结构


5、参与者
    Handle
    ——定义一个处理请求的接口
    ——(可选)实现后继链。
    ConcreteHandler
    ——处理它所负责的请求
    ——可访问它的后继者
    ——如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
    Client
    ——向链上的具体处理者(ConcreteHandler)对象提交请求。
6.代码示例

package chainofresp;
 
abstract class Logger {
    public static int ERR = 3;
    public static int NOTICE = 5;
    public static int DEBUG = 7;
    protected int mask;
 
    // The next element in the chain of responsibility
    protected Logger next;
 
    public void setNext(Logger log) {
        next = log;
    }
 
    public void message(String msg, int priority) {
        if (priority <= mask) {
            writeMessage(msg);
        }
        if (next != null) {
            next.message(msg, priority);
        }
    }
 
    abstract protected void writeMessage(String msg);
}
 
class StdoutLogger extends Logger {
    public StdoutLogger(int mask) { 
        this.mask = mask;
    }
 
    protected void writeMessage(String msg) {
        System.out.println("Writing to stdout: " + msg);
    }
}
 
 
class EmailLogger extends Logger {
    public EmailLogger(int mask) {
        this.mask = mask;
    }
 
    protected void writeMessage(String msg) {
        System.out.println("Sending via email: " + msg);
    }
}
 
class StderrLogger extends Logger {
    public StderrLogger(int mask) {
        this.mask = mask;
    }
 
    protected void writeMessage(String msg) {
        System.err.println("Sending to stderr: " + msg);
    }
}
 
public class ChainOfResponsibilityExample {
 
    private static Logger createChain() {
        // Build the chain of responsibility
 
        Logger logger = new StdoutLogger(Logger.DEBUG);
 
        Logger logger1 = new EmailLogger(Logger.NOTICE);
        logger.setNext(logger1);
 
        Logger logger2 = new StderrLogger(Logger.ERR);        
        logger1.setNext(logger2);
 
        return logger;
    }
 
    public static void main(String[] args) {
 
        Logger chain = createChain();
 
        // Handled by StdoutLogger (level = 7)
        chain.message("Entering function y.", Logger.DEBUG);
 
        // Handled by StdoutLogger and EmailLogger (level = 5)
        chain.message("Step1 completed.", Logger.NOTICE);
 
        // Handled by all three loggers (level = 3)
        chain.message("An error has occurred.", Logger.ERR);
    }
 
}
/*
The output is:
   Writing to stdout:   Entering function y.
   Writing to stdout:   Step1 completed.
   Sending via e-mail:  Step1 completed.
   Writing to stdout:   An error has occurred.
   Sending via e-mail:  An error has occurred.
   Writing to stderr:   An error has occurred.
*/
  • 大小: 40.4 KB
  • 大小: 18.5 KB
分享到:
评论

相关推荐

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

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

    design-pattern-java.pdf

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

    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)

    23种 设计模式---面向对象的基本原则

    - 责任链模式(Chain of Responsibility):避免将处理请求的发送者和接收者耦合在一起,让多个对象都有可能处理请求。 - 命令模式(Command):将一个请求封装为一个对象,以便使用不同的请求、队列或者日志请求...

    设计模式精解——GoF23中设计模式解析

    9. **Chain of Responsibility模式**:避免请求发送者与接收者耦合在一起,使得多个对象都有可能处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。这种模式适用于多个对象可能处理同...

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

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

    PHP设计模式概论【概念、分类、原则等】

    行为型模式:这一类模式涉及对象间责任的分配和交互,例如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、访问者模式(Visitor)、迭代器模式(Iterator)、命令模式(Command)...

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

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

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

    最后,行为型模式着重于对象之间的交互和职责分配,如观察者模式(Observer)、责任链模式(Chain of Responsibility)和策略模式(Strategy),它们提供了处理对象之间交互和决策的多种策略。 面向对象设计的四个...

    设计模式 - 可复用面向对象软件的基础(高清版).rar

    3. 行为型模式:这一类模式涉及到对象之间的通信和职责分配,如观察者模式(Observer)、责任链模式(Chain of Responsibility)、命令模式(Command)以及策略模式(Strategy)。这些模式提供了一种灵活的方式来...

    c#设计模式随书源码

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

    设计模式PPT---25种设计模式详解

    1. 责任链模式(Chain of Responsibility):将请求沿着处理者链传递,直到某个处理者处理它。 2. 命令模式(Command):将命令封装为一个对象,以便使用不同的请求、队列或者日志请求等。 3. 解释器模式...

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

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

    系统架构设计师 设计模式

    行为型模式则关注对象间的通信和职责分配,如观察者模式(Observer)、模板方法模式(Template Method)和责任链模式(Chain of Responsibility)。这些模式有助于实现对象间的协作,提高代码的灵活性。比如,观察者...

    二十三种设计模式迷你手册

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

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    - **3.9 Chain of Responsibility模式**:职责链模式允许多个处理者处理请求。 - **3.10 Iterator模式**:迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **3.11 ...

Global site tag (gtag.js) - Google Analytics