【C++设计模式】责任链模式

1 含义

责任链模式主要用于处理请求, 按照顺序将请求动态传递给一系列的潜在接收者, 直至其中一名接收者对请求进行处理。

2 模式结构

在这里插入图片描述

3 代码实现

举例:请假是我们日常生活中经常遇到的事,一般请假按请的时间长短需要跟不同级别的管理者请,就是请假这个请求根据时间长短可由不同的处理者处理,非常适合责任链模式。


#include <iostream>
using namespace std;

//抽象处理者
class Handler
{
public:
    Handler() { m_pNextHandler = NULL; }
    virtual ~Handler() {}

    //设置下一个处理者
    void SetNextHandler(Handler *successor) { m_pNextHandler = successor; }

    //处理请求
    virtual void HandleRequest(int days) = 0;
protected:
    Handler *m_pNextHandler;  // 后继者
};


//具体处理者、主管
class Director :public Handler
{
public:
    //处理请求
    virtual void HandleRequest(int days)
    {
        if (days <= 1)
        {
            cout << "我是主管,有权批准一天假,同意了!" << endl; 
        }
        else
        {
            m_pNextHandler->HandleRequest(days);
        }
    }
};

//具体处理者、经理
class Manager :public Handler
{
public:
    //处理请求
    virtual void HandleRequest(int days)
    {
        if (days <= 3)
        {
            cout << "我是经理,有权批准三以下的假,同意了!" << endl;
        }
        else
        {
            m_pNextHandler->HandleRequest(days);
        }
    }
};

//具体处理者、老板
class Boss :public Handler
{
public:
    //处理请求
    virtual void HandleRequest(int days)
    {
        if (days <= 7)
        {
            cout << "我是老板,最多让你请7天假,同意了!" << endl;
        }
        else
        {
            cout << "你请的假事假太长了,不同意!" << endl;
        }
    }
};



//场景
int main()
{
    Handler *director = new Director;
    Handler *manager = new Manager;
    Handler *boss = new Boss;

    //设置责任链
    director->SetNextHandler(manager);
    manager->SetNextHandler(boss);


    director->HandleRequest(1);
    director->HandleRequest(2);
    director->HandleRequest(5);
    director->HandleRequest(8);
    return 0;
}

/*输出:
我是主管,有权批准一天假,同意了!
我是经理,有权批准三以下的假,同意了
我是老板,最多让你请7天假,同意了!
你请的假事假太长了,不同意!*/

4 优缺点

4.1 优点

单一职责原则。 你可对发起操作和执行操作的类进行解耦。
开闭原则。 你可以在不更改现有代码的情况下在程序中新增处理者。

4.2 缺点

每个请求都从头到尾遍历。
如果建链不当,可能会造成循环调用,这将导致系统陷入死循环

5 适用场景

不同的请求需要不同权限的对象来处理的情况。

参考

1.https://blog.csdn.net/a369189453/article/details/81293075
2.https://refactoringguru.cn/design-patterns/chain-of-responsibility

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值