职责链(Chain of Responsibility)模式

职责链(Chain of Responsibility)模式:使多个对象都有机会处理请求,从而避免请求发送者呵接受者之间的耦合关系。

将这个对象连成一条链子,并沿着这条链传递该请求,知道有一个对象处理它。

/*
* 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。
    这个角色通常由一个抽象类或接口实现。
* 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。
    由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
*/

在抽象处理者(Handler) 设置继任者:

       protected Handler successor;
        // 方法
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }

以便于找到下一个人。

 // 设置链的责任
            Handler h1 = new ConcreteHandler1();
            Handler h2 = new ConcreteHandler2();
            Handler h3 = new ConcreteHandler3();
            h1.SetSuccessor(h2);
            h2.SetSuccessor(h3);

            // 生成和处理请求
            int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

            foreach (int request in requests)
                h1.HandleRequest(request);

            Console.WriteLine("\n==================\n");

    /// <summary>
    /// 抽象处理者(Handler)角色
    /// </summary>
    public abstract class Handler
    {

        protected Handler successor;
        // 方法
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }
        abstract public void HandleRequest(int request);
    }

    /// <summary>
    /// 具体处理者1
    /// </summary>
    public class ConcreteHandler1 : Handler
    {
        //从写基类 方法
        public override void HandleRequest(int request)
        {
            if (request >= 0 && request < 10)
                Console.WriteLine("{0} handled request {1}",
                  this, request);
            else
                if (successor != null)
                    successor.HandleRequest(request);
        }

    }

    /// <summary>
    /// 具体处理者2
    /// </summary>
    public class ConcreteHandler2 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 10 && request < 20)
                Console.WriteLine("{0} handled request {1}",
                  this, request);
            else
                if (successor != null)
                    successor.HandleRequest(request);
        }
    }

    // 具体处理者3
    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 20 && request < 30)
                Console.WriteLine("{0} handled request {1}",
                  this, request);
            else
                if (successor != null)
                    successor.HandleRequest(request);
        }
    }

职责链(Chain of Responsibility)模式,布布扣,bubuko.com

时间: 2024-10-25 21:36:20

职责链(Chain of Responsibility)模式的相关文章

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

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

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模式

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

基于.net 职责链来实现 插件模式

插件式的例子 QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了 eclipse ,X Server 等等 插件式的好处 插件降低框架的复杂性,把扩展功能从框架中剥离出来 让第三方有机会来扩展程序的功能 思路       公开一个插件接口,如果.DLL或.EXE的代码中有继承这个接口就将其示为插件,并将这些插件放在同一目录.运行程序的时候扫描目   录并通过反射判断.DLL或.EXE中是否存在该接口,若存在,则当作插件加载进来.如下图示   基于.net 职责链来实现 插件模式   

Behavioral模式之Chain of Responsibility模式

1.意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递改请求,知道有一个对象处理它为止. 2.别名 无 3.动机 考虑一个图形用户界面中的上下文有关的帮助机制.用户在界面的任一部分上点击就可以以得到帮助信息,所提供的帮助依赖于点击的是界面的哪一部分以及其上下文. 4.适用性 以下情况使用Responsibility模式: 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象

设计模式之Chain of Responsibility模式(笔记)

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,沿着该条链处理请求,直到有一个对象处理它为止. 首先定义一个Handle抽象类,定义处理请求的接口 public abstract class Handler { protected Handler superior;//上级 //设置上级 public void setSuperior(Handler superior){ this.superior=superior; } public

【行为型】Chain of responsibility模式

职责链模式将对象的请求处理组成链式结构,并将请求按链式结构逐个传递下去,直接被其中的某个处理者处理为止.由此可知,职责链模式的适用场合是对指定请求,可以有多个请求处理者(或称为请求响应者),但用户并不知道(也不需要知道--------此如做到请求者与响应者的解耦合)当时运行环境下该请求会被具体的哪个处理者处理(又或者说完全都没有被响应).请求者只是抛出一个请求,响应链内部(即:模式内部)自己决定是否能处理以及谁能处理该请求.该模式的类结构图参考如下: 模式的编码结构参考如下: 1 namespa

c++ 行为型模式-责任链(Chain of Responsibility)

1) 意图 使多个对象连成一条链,沿着这条链传递请求,直到有个对象处理它为止. 2) 结构 其中: Handler定义一个处理请求的接口 ConcreteHandler处理它所负责的请求 Client向链上具体处理提交请求 3) 适用性 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定 想在不明确指定接收者的情况下向多个对象中的一个提交一个请求 可处理一个请求的对象集合应被动态指定 4) 举例 1 #include <iostream> 2 #include <list&g

20 关卡设计-责任链(Chain of Responsibility)

1 /// <summary> 2 /// 处理信息的接口 3 /// </summary> 4 public abstract class Handler { 5 6 /// <summary> 7 /// 下一个请求接收者 8 /// </summary> 9 protected Handler m_NextHandler = null; 10 11 public Handler(Handler theNextHandler) { 12 m_NextHa

设计模式19:Chain Of Responsibility 职责链模式(行为型模式)

Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦. 意图(Intent) 使多个对象都有机会处理请求,从而避免请求的发送者和接受者