圖檔引用于百度
簡介:避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,将這些對象連接配接成一條鍊,并且沿着這條鍊傳遞請求,直到有對象處理它為止。
優點:簡化對象,讓對象不需要知道鍊的結構。增加新的請求處理類很友善。降低耦合度。它将請求的發送者和接收者解耦
缺點:不能保證請求一定被接收,在進行代碼調試時不太友善,可能會造成循環調用
例子背景:張三想要報帳,而每個管理者保險額度不同,需要一級一級往上交,這裡我們隻處理張三的請求
責任鍊模式代碼:
- 管理者類:
#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(轉載請說明出處)