天天看點

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(轉載請說明出處)

繼續閱讀