职责链模式,就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
职责链模式结构图
image职责链模式基本代码
#include <iostream>
using namespace std;
// Handle类,处理请求的接口:
class Handle {
protected:
Handle* successor;
public:
void SetSuccessor(Handle* s) {
successor = s;
}
virtual void HandleRequest(int request) {
successor->HandleRequest(request);
}
};
// ConcreteHandler1 & ConcreteHandler2,具体处理类,处理其负责的请求,如果不能处理就将请求转发给它的后继者:
class ConcreteHandler1 : public Handle {
public:
void HandleRequest(int request) {
if (request == 1) cout << "HandleRequest1:" << request << endl;
else if (successor != NULL) successor->HandleRequest(request);
}
};
class ConcreteHandler2 : public Handle {
public:
void HandleRequest(int request) {
if (request == 2) cout << "HandleRequest2:" << request << endl;
else if (successor != NULL) successor->HandleRequest(request);
}
};
// 客户端代码实现:
int main() {
int request1 = 1;
int request2 = 2;
Handle* h1 = new ConcreteHandler1();
Handle* h2 = new ConcreteHandler2();
h1->SetSuccessor(h2); // 设置链
h2->SetSuccessor(h1);
h1->HandleRequest(request2); // HandleRequest2:2
h2->HandleRequest(request1); // HandleRequest1:1
delete h1;
delete h2;
return 0;
}
应用场景
优点:
- 当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它。
- 接受者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持所有的候选接受者的引用,这就大大降低了耦合度。
- 在客户端设置链结构,增强了给对象指派职责的灵活性。
网友评论