博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
职责链模式(Chain of Responsibility)
阅读量:5105 次
发布时间:2019-06-13

本文共 1678 字,大约阅读时间需要 5 分钟。

意图
十多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。
将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
应用场景
uu
类图
20112816-6fc08460a065469f976c4968bfe6f731.jpg
参与者
  • Handler
    定义一个处理请求的接口
    (可选)实现后继续
  • ConcreteHandler
    处理它所负责的请求接口
    可访问它的后继者
    如果处理该请求,就处理之。否者将该请求转发给它的后继者。
  • Client
    向链上的ConcreteHandler对象提交请求
代码
#include <iostream>
using namespace std;
class Handler
{
protected:
    Handler *successor;//后继者
public:
    //设置后继者
    void SetSuccessor(Handler *successor)
    {
        this->successor = successor;
    }
    //处理请求的抽象方法
    virtual void HandleRequest(int request) = 0;
};
//处理0-10的请求,否者交给后继者处理
class ConcreteHandler1:public Handler
{
public:
    void HandleRequest(int request)
    {
        //处理0-10的请求
        if(request>=0 && request<10)
        {
            cout<<"处理请求: "<<request<<endl;
        }
        //否者,交给后继者处理
        else if(successor != NULL)
        {
            successor->HandleRequest(request);
        }
    }
};
//处理10-20的请求,否者交给后继者处理
class ConcreteHandler2:public Handler
{
public:
    void HandleRequest(int request)
    {
        //处理10-20的请求
        if(request>=10 && request<20)
        {
            cout<<"处理请求: "<<request<<endl;
        }
        //否者,交给后继者处理
        else if(successor != NULL)
        {
            successor->HandleRequest(request);
        }
    }
};
//客户端代码,向连接上的具体处理者对象提交请求
int main()
{
    Handler *pH1 = new ConcreteHandler1();
    Handler *pH2 = new ConcreteHandler2();
    //设置职责连上家与下家
    pH1->SetSuccessor(pH2);
    int request[]={
2, 4 , 19, 6 ,14};
    for(int i=0; i<5; i++)
    {
        pH1->HandleRequest(request[i]);
    }
}
思考(myself)
这样实现的职责连模式可能会降低程序的可扩展性。
比如:多个
ConcreteHandler可以处理同样的请求,但是他们的优先级不同。程序完成后,他们的优先级变化了,或者有些
ConcreteHandler死亡了。此时,代码就不易修改了。
改进: 可以用vector保存
多个
ConcreteHandler,通过优先级排序。然后遍历处理请求。
当一个
ConcreteHandler死亡时,从vector中删除即可。
当优先级变化了,重新排序即可。
此时用优先队列可能更好一些。
具体:比如一个公司的经理,总经理,总监都可以处理加薪的请求。经理优先级更高。
某一天公司调整,又增加了一名项目经理,也可以处理加薪请求,且优先级比经理低,比总经理高。此时就不易对程序进行修改了。
如果用vector实现的话,只用将项目经理插到经理后面即可。

转载于:https://www.cnblogs.com/controlfate/p/3432821.html

你可能感兴趣的文章
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
伪类与超链接
查看>>
centos 7 redis-4.0.11 主从
查看>>
博弈论 从懵逼到入门 详解
查看>>
永远的动漫,梦想在,就有远方
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
视频:"我是设计师"高清完整版Plus拍摄花絮
查看>>
VALSE2019总结(4)-主题报告
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
中国烧鹅系列:利用烧鹅自动执行SD卡上的自定义程序(含视频)
查看>>
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
iframe跨域与session失效问题
查看>>
aboutMe
查看>>