C++责任链模式
意图
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
适用性
- 有多个对象可以处理以恶搞请求,哪个对象处理该请求运行时刻自动确定
- 你想在不明确接受者的情况下,向多个对象中的一个提交一个请求
- 可处理一个请求的对象集合应被动态指定
示意性代码
#include <iostream>
using namespace std;
// 抽象处理者:领导类
class Leader {
public:
void setNext(Leader* next) {
this->m_next = next;
}
Leader* getNext() const {
return m_next;
}
virtual ~Leader() { }
// 处理请求的方法
virtual void handleRequest(int leaveDays) = 0;
private:
Leader* m_next;
};
// 具体处理者1 : 班主任类
class ClassAdviser : public Leader {
public:
void handleRequest(int LeaveDays) override {
if (LeaveDays <= 2) {
cout << "班主任批准您请假" << LeaveDays << "天\n";
} else {
if (getNext() != nullptr) {
getNext()->handleRequest(LeaveDays);
} else {
cout << "请假天数太多,没有人批准该假条" << endl;
}
}
}
};
// 具体处理者2: 系主任类
class DepartmentHead : public Leader {
public:
void handleRequest(int LeaveDays) override {
if (LeaveDays <= 7) {
cout << "系主任批准您请假" << LeaveDays << "天\n";
} else {
if (getNext() != nullptr) {
getNext()->handleRequest(LeaveDays);
} else {
cout << "请假天数太多,没有人批准该假条" << endl;
}
}
}
};
// 具体处理者3: 院长类
class Dean : public Leader {
public:
void handleRequest(int LeaveDays) override {
if (LeaveDays <= 10) {
cout << "系主任批准您请假" << LeaveDays << "天\n";
} else {
if (getNext() != nullptr) {
getNext()->handleRequest(LeaveDays);
} else {
cout << "请假天数太多,没有人批准该假条" << endl;
}
}
}
};
int main() {
// 组装责任链
Leader* teacher1 = new ClassAdviser();
Leader* teacher2 = new DepartmentHead();
Leader* teacher3 = new Dean();
teacher1->setNext(teacher2);
teacher2->setNext(teacher3);
int n;
// 提交请求
while(cin >> n) {
teacher1->handleRequest(n);
}
delete teacher1;
teacher1 = nullptr;
delete teacher2;
teacher2 = nullptr;
delete teacher3;
teacher3 = nullptr;
}