- 浏览: 62441 次
- 性别:
- 来自: 北京
文章分类
最新评论
CHAIN OF RESPONSIBILITY(职责链) —— 对象行为型模式
- 博客分类:
- 设计模式
1、意图
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之前的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
2、动机
考虑一个图形用户界面中的上下文有关的帮助机制。用户在界面的任一部分上点击就可以得到帮助信息,所提供的帮助依赖于点击的是界面的哪一部分以及其上下文。例如,对话框中的按钮的帮助信息就可能和主窗口中类似的按钮不同。如果对那一部分界面没有特定的帮助信息,那么帮助系统应该显示一个关于当前上下文的较一般的帮助信息——比如说,整个对话框。
因此很自然地,应根据普遍性(generality)即从最特殊到最普通的顺序来组织帮助信息。而且,很明显,在这些用户界面对象中会有一个对象来处理帮助请求;至于是哪一个对象则取决于上下文以及可用的帮助具体到何种程度。
这儿的问题是提交帮助请求的对象(如按钮)并不明确知道是谁是最终提供帮助的对象。我们要有一种办法将提交帮助请求的对象与可能提供帮助信息的对象解耦(decouple)。Chain of Responsibility模式告诉我们应该怎么做。
这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接收者。该请求沿对项链直至其中的一个对象处理它,如下图所示。
从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转给链中的下一个候选者。提交请求的对象并不明确地知道哪一个对象将会处理它——我们说该请求有一个隐士接受者(implicit receiver)。
3、适用性
在以下条件下使用Responsibility链:
有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
可处理一个请求的对象集合应被动态指定。
4、结构
5、参与者
Handle
——定义一个处理请求的接口
——(可选)实现后继链。
ConcreteHandler
——处理它所负责的请求
——可访问它的后继者
——如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
Client
——向链上的具体处理者(ConcreteHandler)对象提交请求。
6.代码示例
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之前的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
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. */
发表评论
-
STRATEGY(策略)——对象行为型模式
2013-06-17 16:19 6791、意图 定义一系列的算法,把它们一个个封装起来,并且 ... -
STATE(状态)—— 对象行为型模式
2013-06-14 16:49 7801、意图 允许一个 ... -
OBSERVER(观察者)——对象行为型模式
2013-06-13 15:36 7011、意图 定义对象 ... -
MEDIATOR(中介者)——对象行为型模式
2013-06-09 16:17 6771、意图 用一个中 ... -
PROXY(代理) —— 对象结构型模式
2013-06-05 11:24 7531、意图 为其他对 ... -
DECORATOR(装饰) -—— 对象机构型模式
2013-06-03 11:43 6971、意图 动态地给一个对象添加一些额外的职责。就增加功 ... -
COMPOSITE(组合) ---- 对象结构型模式
2013-05-31 15:12 7701、意图 将对象组 ... -
FACTORY METHOD(工厂方法) ---- 对象创建型模式
2013-05-28 11:43 7201、意图 定义一个用于创建对象的接口,让子类决定实例化 ... -
设计模式的三大分类解析
2013-05-24 14:48 844设计模式在功能上 ... -
TEMPLATE METHOD(模板方法)----- 类行为型模式
2013-04-07 11:27 7001、意图 定义一个 ... -
ADAPTER(适配器) --- 类对象结构型模式
2013-03-28 11:33 5921、意图 将一个类的接口转化成客户希望的另外一个接口。 ... -
BRIGE(桥接) ------ 对象结构型模式
2013-03-27 11:20 7401、意图 将抽象部 ... -
COMMAND(命令) ---- 对象行为型模式
2013-03-06 11:20 7241、意图 将一个请求封装为一个对象,从而使你可用不同的 ... -
VISITOR(访问者) ---- 对象行为型模式
2013-02-26 17:03 9041、意图 表示 ... -
Builder(生成器)---- 对象创建型模式
2013-02-25 15:54 6281、意图 将一个复杂对象的创建和它的表示分离,使得同样的 ... -
ABSTRACT FACTORY(抽象工厂)------ 对象创建型模式
2013-02-22 11:21 6801、意图 提供一个创建一系列相关或相互依赖对象的接口,而 ... -
Flyweight pattern(享元模式)
2013-02-20 14:45 7661. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展 ... -
Facade模式 --- 对象结构型模式
2013-02-19 17:03 6991、意图 为子系统中 ... -
23个设计模式的名字和意图
2013-02-19 15:41 7211、Abstract Factory:提供 ... -
从MVC理解设计模式
2013-02-19 14:40 772本文将透过MVC来帮助我们理解“模式”这一术语的含义。 ...
相关推荐
在软件设计中,职责链(Chain of Responsibility)模式是一种行为设计模式,它允许将请求沿着处理者对象的链式结构传递,直到某个对象能够处理它为止。这种模式提供了一种方式来避免请求发送者与接收者之间的耦合,...
十一个行为型模式 十一个行为型模式 职责链模式-Chain of Responsibility Pattern 请求的链式处理——职责链模式(一) 请求的链式处理——职责链模式(二) 请求的链式处理——职责链模式(三) 请求的链式处理——...
职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接收者的耦合关系。将对象连成链并沿着这条链传递请求直到被处理 下面是一个设计模式的demo: #!/usr/bin/env python # -*- ...
C#设计模式(23种设计...19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
- 责任链模式(Chain of Responsibility):避免将处理请求的发送者和接收者耦合在一起,让多个对象都有可能处理请求。 - 命令模式(Command):将一个请求封装为一个对象,以便使用不同的请求、队列或者日志请求...
9. **Chain of Responsibility模式**:避免请求发送者与接收者耦合在一起,使得多个对象都有可能处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。这种模式适用于多个对象可能处理同...
3. **行为型模式**:包括策略(Strategy)、模板方法(Template Method)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、责任链(Chain of Responsibility)、命令(Command)、备忘录(Memento)、...
行为型模式:这一类模式涉及对象间责任的分配和交互,例如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、访问者模式(Visitor)、迭代器模式(Iterator)、命令模式(Command)...
行为型模式则关注对象间的交互和职责分配,包括责任链模式(Chain of Responsibility)、观察者模式(Observer)、命令模式(Command)等。这些模式帮助我们更好地处理对象之间的通信,让代码更具可读性和可维护性。...
最后,行为型模式着重于对象之间的交互和职责分配,如观察者模式(Observer)、责任链模式(Chain of Responsibility)和策略模式(Strategy),它们提供了处理对象之间交互和决策的多种策略。 面向对象设计的四个...
3. 行为型模式:这一类模式涉及到对象之间的通信和职责分配,如观察者模式(Observer)、责任链模式(Chain of Responsibility)、命令模式(Command)以及策略模式(Strategy)。这些模式提供了一种灵活的方式来...
行为型模式则涉及对象间职责的分配和交互,如观察者(Observer)、命令(Command)和责任链(Chain of Responsibility)模式,这些模式提供了处理行为和通信的方法。 在"Programs"这个压缩包文件中,可能包含了各种...
1. 责任链模式(Chain of Responsibility):将请求沿着处理者链传递,直到某个处理者处理它。 2. 命令模式(Command):将命令封装为一个对象,以便使用不同的请求、队列或者日志请求等。 3. 解释器模式...
行为型模式则关注对象之间的交互和职责分配,如策略模式(Strategy)、观察者模式(Observer)和责任链模式(Chain of Responsibility)等,它们有助于提高代码的灵活性和可扩展性。 在C#中,设计模式的实现往往...
行为型模式则关注对象间的通信和职责分配,如观察者模式(Observer)、模板方法模式(Template Method)和责任链模式(Chain of Responsibility)。这些模式有助于实现对象间的协作,提高代码的灵活性。比如,观察者...
其中包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模式...
- **3.9 Chain of Responsibility模式**:职责链模式允许多个处理者处理请求。 - **3.10 Iterator模式**:迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **3.11 ...