Behavioral模式之Chain of Responsibility模式

1.意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递改请求,知道有一个对象处理它为止。

2.别名

3.动机

考虑一个图形用户界面中的上下文有关的帮助机制。用户在界面的任一部分上点击就可以以得到帮助信息,所提供的帮助依赖于点击的是界面的哪一部分以及其上下文。

4.适用性

以下情况使用Responsibility模式:

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

5.结构

接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。先看看关系图:

Abstracthandler类提供了get和set方法,方便MyHandle类设置和修改引用对象,MyHandle类是核心,实例化后生成一系列相互持有的对象,构成一条链。

6.代码示例

实现代码:

一个接口:

public interface Handler {
    public void operator();
}

实现:

public abstract class AbstractHandler {

    private Handler handler;

    public Handler getHandler() {
        return handler;
    }

    public void setHandler(Handler handler) {
        this.handler = handler;
    }

}

public class MyHandler extends AbstractHandler implements Handler {

    private String name;

    public MyHandler(String name) {
        this.name = name;
    }

    @Override
    public void operator() {
        System.out.println(name+"deal!");
        if(getHandler()!=null){
            getHandler().operator();
        }
    }
}
测试类:

public class Test {

public static void main(String[] args) {
    MyHandler h1 = new MyHandler("h1");
    MyHandler h2 = new MyHandler("h2");
    MyHandler h3 = new MyHandler("h3");

    h1.setHandler(h2);
    h2.setHandler(h3);

    h1.operator();
}

}

“`

输出:

h1deal!

h2deal!

h3deal!

此处强调一点就是,链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象。

7.相关模式

  • 职责链常与Composite一起使用。这种情况下,一个构件的父构件可作为它的后继。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539

时间: 2024-12-10 18:12:03

Behavioral模式之Chain of Responsibility模式的相关文章

Chain of Responsibility模式

消息传递是面向对象开发中经常用到的机制,例如异常的传递,如果当前函数/类无法处理异常,可以将其抛到上一层.消息传递类似,如果一个类收到消息,如果当前类无法处理,可以将消息按照预先定义好的路径传递下去,直到有类可以处理这个消息.这就是Chain of Responsibility模式. Handle类中持有自己的指针/引用,指向某一个派生类.如果当前类无法处理消息,则调用派生类来处理. 实现: Handle.h #ifndef _HANDLE_H_ #define _HANDLE_H_ class

Java 实现责任链(Chain of Responsibility)模式

类图 /** * 抽象责任 * @author stone * */ public abstract class IFilter { private IFilter successor; public IFilter getSuccessor() { return successor; } public void setSuccessor(IFilter successor) { this.successor = successor; } public abstract void handleF

职责链模式(Chain of Responsibility)的Java实现

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用场景: 1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定: 2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求: 3.处理一个请求的对象集合应被动态指定. 在大学里面当班干部,时常要向上级申请各方面的东西.譬如申请全班外出秋游,普通同学将申请表交给班长,班

深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦.这就是职责链模式的模式动机. 模式定义职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个

第22章 职责链模式(Chain of Responsibility)

原文 第22章 职责链模式(Chain of Responsibility) 职责链模式 导读:职责链模式是一个既简单又复杂的设计模式,刚开始学习这个设计模式的时候光示例都看了好几遍.就为了理清里面的逻辑走向.是个值得慢慢品味的设计模式 概述:   使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 结构图:          代码举例:公司请假   1 2 3 4 5 6 7 8 9 10 11 12

23种设计模式之责任链模式(Chain of Responsibility)

责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理. 优点: 1)降低了耦合度. 2)增加向对象指定责任的灵活性. 3)由于在一个类中产生的事件可以被发送到组成中的其它类处理器上,类的集合可以作为一个整体. 使用场景: 1)多个对象可以处理一个请求,而其处理器却是未知的. 2)想要在不指定确

C++设计模式实现--职责链(Chain of Responsibility)模式

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

设计模式(十八)职责链模式(Chain of Responsibility)-行为型

职责链模式(Chain of Responsibility) 职责链模式在程序开发应用中十分广泛,经常使用在公文审批.出差报支等地方,职责链模式的作用就是将对象各自处理的职责分开,虽然职责很多,但是最终只有一个职责进行处理. 实现原理图 职责链模式实现原理图 应用 struts2的拦截器,OA办公应用 在职责链模式中,将条件语句改成多个职责类进行处理,如果不是自己处理,则自动转到下一个职责类,如果在转给下一个职责类进行处理前,需要修改当前的状态,此时就需要用到状态模式,也就是下一个设计模式. 参

GOF23设计模式之责任链模式(chain of responsibility)与结构型模式总结经典

 责任链模式:Chain of responsibility      将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象. 场景:      打牌时,轮流出牌.      接力赛跑      大学中,奖学金审批.      公司中,公文审批.   结构型模式汇总: 代理模式:为真实对象提供一个代理,从而控制对真实对象的访问. 适配器模式:使原本由于接口不兼容不能一起工作的类,可以一起工作. 桥