此为设计模式第十谈!
用总-分-总的结构和生活化的例子给你讲解设计模式!
码农不易,各位学者学到东西请点赞收藏支持支持!
开始部分:
总:责任链的本质是使多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
分:
1.老规矩,打开VS创建一个控制台程序
2.实现编码,这里用学生在学校请假的例子来辅助理解
2.1 抽象处理者,设置下一个节点和获取下一个节点
2.2 具体处理者,实现处理逻辑
2.3 用链表结构来组装责任链
#include <iostream>
using namespace std;
// 抽象处理者:领导者类
class Leader {
public:
void SetNext(Leader* next) {
this->mnext = next;
}
Leader* GetNext()const {
return mnext;
}
virtual ~Leader() {
}
// 处理请求方法
virtual void HandlerRequest(int days) = 0;
private:
Leader* mnext;
};
// 具体处理者1:班主任
class headmaster :public Leader {
public:
void HandlerRequest(int days)override {
if (days <= 3)
{
cout << "\n班主任已经批准你请假:" << days << "天。" << endl;
}
else
{
if (GetNext() != nullptr)
{
GetNext()->HandlerRequest(days);
}
else
{
cout << "\n你请假的天数太多,没有人能够批准你请假。" << endl;
}
}
}
};
// 具体处理者2:系主任
class departmentHead :public Leader {
public:
void HandlerRequest(int days)override {
if (days <= 10)
{
cout << "\n系主任已经批准你请假:" << days << "天。" << endl;
}
else
{
if (GetNext() != nullptr)
{
GetNext()->HandlerRequest(days);
}
else
{
cout << "\n你请假的天数太多,没有人能够批准你请假。" << endl;
}
}
}
};
// 具体处理者3:校长
class principal :public Leader {
public:
void HandlerRequest(int days)override {
if (days <= 30)
{
cout << "\n校长已经批准你请假:" << days << "天。" << endl;
}
else
{
if (GetNext() != nullptr)
{
GetNext()->HandlerRequest(days);
}
else
{
cout << "\n你请假的天数太多,没有人能够批准你请假。" << endl;
}
}
}
};
int main()
{
// 组装责任链
Leader* t1 = new headmaster();
Leader* t2 = new departmentHead();
Leader* t3 = new principal();
t1->SetNext(t2);
t2->SetNext(t3);
// 提交请假请求天数day
int day = 0;
cout << "\n\n请输入请假天数:";
while (cin >> day)
{
t1->HandlerRequest(day);
}
delete t1;
t1 = nullptr;
delete t2;
t2 = nullptr;
delete t3;
t3 = nullptr;
return 0;
}