天天看点

C++25设计模式之责任链模式

C++25设计模式之责任链模式

图片引用于百度

简介:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

优点:简化对象,让对象不需要知道链的结构。增加新的请求处理类很方便。降低耦合度。它将请求的发送者和接收者解耦

缺点:不能保证请求一定被接收,在进行代码调试时不太方便,可能会造成循环调用

例子背景:张三想要报销,而每个管理者保险额度不同,需要一级一级往上交,这里我们只处理张三的请求

责任链模式代码:

  • 管理者类:
#pragma once
#include <string>
#include <iostream>
using namespace std;

class Leadership
{
public:
        Leadership() = default;
        virtual ~Leadership()
        {
                delete m_leader;
        }
private:
        Leadership* m_leader = nullptr;
public:
        Leadership* GetLeader()
        {
                return m_leader;
        }
        void SetLeader(Leadership* leader)
        {
                m_leader = leader;
        }
        virtual string ExamineandApprove(string user, double fee) = 0;
};
           
  • 各级管理者类:
#pragma once
#include "Leadership.h"

class Director : public Leadership
{
public:
        Director(Leadership* leader = nullptr)
        {
                SetLeader(leader);
        }
        virtual string ExamineandApprove(string user, double fee)
        {
                string ret;
                if (fee < 700)
                {
                        if (user == "张三")
                        {
                                ret.append(string("主管同意了") + ret + "的报销请求,去找财务吧。");
                        }
                        else
                        {
                                ret.append(string("主管不同意") + ret + "的报销请求。");
                        }
                }
                else if (GetLeader())
                {
                        ret = GetLeader()->ExamineandApprove(user, fee);
                }
                return ret;
        }
};

class Manager : public Leadership
{
public:
        Manager(Leadership* leader = nullptr)
        {
                SetLeader(leader);
        }
        virtual string ExamineandApprove(string user, double fee)
        {
                string ret;
                if (fee < 1000)
                {
                        if (user == "张三")
                        {
                                ret.append(string("经理同意了") + ret + "的报销请求,去找财务吧。");
                        }
                        else
                        {
                                ret.append(string("经理不同意") + ret + "的报销请求。");
                        }
                }
                else if(GetLeader())
                {
                        ret = GetLeader()->ExamineandApprove(user, fee);
                }
                return ret;
        }
};

class GeneralManager : public Leadership
{
public:
        GeneralManager(Leadership* leader = nullptr)
        {
                SetLeader(leader);
        }
        virtual string ExamineandApprove(string user, double fee)
        {
                string ret;
                if (fee >= 1500)
                {
                        if (user == "张三")
                        {
                                ret.append(string("总经理同意了") + ret + "的报销请求,去找财务吧。");
                        }
                        else
                        {
                                ret.append(string("总经理不同意") + ret + "的报销请求。");
                        }
                }
                else if (GetLeader())
                {
                        ret = GetLeader()->ExamineandApprove(user, fee);
                }
                return ret;
        }
};
           
  • 引用:
#include "Leaders.h"

int main()
{
        string zhangsan("张三");
        string lisi("李四");
        string wangwu("王五");

        
        Leadership* ls1 = new Director(new Manager(new GeneralManager));
        cout << ls1->ExamineandApprove(zhangsan, 500) << endl;
        cout << ls1->ExamineandApprove(lisi, 500) << endl;
        cout << ls1->ExamineandApprove(wangwu, 500) << endl;

        cout << ls1->ExamineandApprove(zhangsan, 900) << endl;
        cout << ls1->ExamineandApprove(lisi, 900) << endl;
        cout << ls1->ExamineandApprove(wangwu, 900) << endl;

        cout << ls1->ExamineandApprove(zhangsan, 1500) << endl;
        cout << ls1->ExamineandApprove(lisi, 1500) << endl;
        cout << ls1->ExamineandApprove(wangwu, 1500) << endl;

        delete ls1;
        getchar();
        return 0;
}
           

总结:

责任链模式(Chain Responsibility):可以降低请求的发送者和接收者之间的耦合度,通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

作者:丶梦爱

博客:https://blog.csdn.net/u014732297(转载请说明出处)

继续阅读