图片引用于百度
简介:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
优点:简化对象,让对象不需要知道链的结构。增加新的请求处理类很方便。降低耦合度。它将请求的发送者和接收者解耦
缺点:不能保证请求一定被接收,在进行代码调试时不太方便,可能会造成循环调用
例子背景:张三想要报销,而每个管理者保险额度不同,需要一级一级往上交,这里我们只处理张三的请求
责任链模式代码:
- 管理者类:
#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(转载请说明出处)