设计模式之二十:责任链模式(Chain of Responsibility)

感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的。

责任链模式:

通过使多个对象都有机会来处理请求的方式避免了请求的发送者和接收者之间的耦合。将接收者组织成链式的结构这样能够将请求沿着这条链进行传递,直到有接收者对它进行处理。

UML类图:

主要包含:

  1. Handler:定义了一个处理请求的接口,实现了定义后继者的方法。
  2. ConcreteHandler:处理各自负责的请求,假设不能处理该请求。将请求传递给它的后继者。
  3. Client:初始化请求到一个链中的详细的Handle中。

C++代码实现例如以下:

#include <iostream>

using namespace std;

class Handler
{
    public:
    void setSuccessor(Handler * h)
    {
        successor=h;
    }
    virtual void handleRequest(int request)=0;
    protected:
    Handler * successor;
};

class ConcreteHandler1:public Handler
{
    public:
    void handleRequest(int request)
    {
        if(request>=0&&request<=10)
            cout<<"ConcreteHandler1 handle between 0 and 10"<<endl;
        else
        {
            if(successor!=NULL)
                    successor->handleRequest(request);
        }
    }

};

class ConcreteHandler2:public Handler
{
    public:
    void handleRequest(int request)
    {
        if(request>10&&request<=20)
            cout<<"ConcreteHandler2 handle between 10 and 20"<<endl;
        else
        {
            if(successor!=NULL)
                    successor->handleRequest(request);
        }
    }

};

class ConcreteHandler3:public Handler
{
    public:
    void handleRequest(int request)
    {
        if(request>20)
            cout<<"ConcreteHandler3 handle greater than 20 "<<endl;
    }

};

int main()
{
    cout<<"主要的责任链模式代码"<<endl;
    Handler *h1=new ConcreteHandler1();
    Handler *h2=new ConcreteHandler2();
    Handler *h3=new ConcreteHandler3();

    h1->setSuccessor(h2);
    h2->setSuccessor(h3);

    int requests[]={1,3,11,19,20,22};
    for(int i=0;i<sizeof(requests)/sizeof(requests[0]);i++)
    {
        h1->handleRequest(requests[i]);
    }
    return 0;

}

运行输出:

时间: 2024-10-09 20:29:44

设计模式之二十:责任链模式(Chain of Responsibility)的相关文章

[设计模式-行为型]责任链模式(Chain of Responsibility)

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3. 调用代码 2 4. 责任链链的特性: 2 5. 模式结构 4 6. 职责链模式包含如下角色:Handler,ConcreteHandler: 具体处理者,HandlerChainUtil ,Client 4 7. 设置哈一个handler,,两个法:排序法,指定法 5 1. 指定法 5 2. 排

责任链模式-Chain of Responsibility(Java实现), 例1

责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. Trouble类 本类是:待责任链来处理的问题Trouble类. 本例子较简单, Trouble只有一个int型作为待处理的编号. public class Trouble { private int number; public Trouble(int number) { this.number

设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之状态模式(State Pattern)>http://blog.csdn.net/yanbober/article/details/45502665 概述 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链

[设计模式] 责任链模式 Chain of Responsibility

转    http://blog.csdn.net/wuzhekai1985   http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向项目主管提交了我的休假申请,项目主管向部门经理提交了我的休假申请:最后,部门经理同意了我的休假申请.是的,一个简单的休假申请,需要这么复杂的流程,这也是一个公司保证它正常运行的必要.如果部门经理休假了,那么我的休假申请由谁审批呢?这个时候由项目主管代替部门经理进行审批.一个休假申请的审批制度有着严格

设计模式 笔记 责任链模式 chain of responsibility

//---------------------------15/04/25---------------------------- //Chain of responsibility 责任链-----对象行为型模式 /* 1:意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象 连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2:动机: 3:适用性: 1>有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 2>你想在不明确指定

重温设计模式(三)——职责链模式(chain of responsibility)

一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二. 什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 1. 链是一系列节点的集合. 2. 链的各节点可灵活拆分再重组. 三. 何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条

设计模式(九)责任链(Chain of Responsibility)

说明 定义: 职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. UML图: 包含角色: 1)Handler:抽象处理着: 2)ConcreteHandler:具体处理者. 代码实现: 典型的"抽象处理者"代码 // 典型的"抽象处理者"代码 abstract class Handler { // 为了使得han

B5:责任链模式 Chain Of Responsibility

使多个对象都有机会处理处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着该链处理请求,直到有一个对象能够处理它为止. UML 示例代码: abstract class Handle { protected $nextHandle; public function setNextHandle(Handle $handle) { $this->nextHandle = $handle; } abstract public function handleRequest(