责任链模式
定义:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成⼀条链,并沿着这条链传递请求,直到有⼀个对象处理它为止。 ——《设计模式》GoF
要点:
- 解耦请求⽅和处理⽅,请求⽅不知道请求是如何被处理,处理⽅的组成是由相互独⽴的⼦处理构成,⼦处理流程通过链表的⽅式连接,⼦处理请求可以按任意顺序组合;
- 责任链请求强调请求最终由⼀个⼦处理流程处理;通过了各个⼦处理条件判断;
- 责任链扩展就是功能链,功能链强调的是,⼀个请求依次经由功能链中的⼦处理流程处理;
- 充分体现了单⼀职责原则;将职责以及职责顺序运⾏进⾏抽象,那么职责变化可以任意扩展, 同时职责顺序也可以任意扩展;
本质:
分离职责,动态组合;
结构图:
在继承的子类中实现自己的职能划分(即能处理什么样的事情),不属于自己的职能范围的向上提交;实现自己的处理方法;由自己编辑责任链的每一环。
#include<string>
class Context {
public:
std::string name;
int day;
};
class IHandler
{
public:
virtual ~IHandler(){}
void SetNextHandler(IHandler* next)
{
_next = next;
}
bool Handler(const Context& ctx) {
if (CanHandle(ctx)) {
return HandleRequest(ctx);
}
else if (GetNextHandler()) {
return GetNextHandler()->HandleRequest(ctx);
}
else
{
}
}
protected:
virtual bool HandleRequest(const Context& ctx) = 0;
virtual bool CanHandle(const Context& ctx) = 0;
IHandler* GetNextHandler() {
return _next;
}
private:
IHandler* _next;
};
class HandleByMainProgram :public IHandler {
protected:
virtual bool HandleRequest(const Context& ctx) {
}
virtual bool CanHandle(const Context& ctx) {
}
};
class HandleByProjMgr :public IHandler {
protected:
virtual bool HandleRequest(const Context& ctx) {
}
virtual bool CanHandle(const Context& ctx) {
}
};
class HandleByBoss : public IHandler {
public:
virtual bool HandleRequest(const Context& ctx) {
//
}
protected:
virtual bool CanHandle(const Context& ctx) {
//
}
};
int main() {
//由用户来组装链条的传递
IHandler* h1 = new HandleByMainProgram();
IHandler* h2 = new HandleByProjMgr();
IHandler* h3 = new HandleByBoss();
h1->SetNextHandler(h2);
Context ctx;
h1->Handler(ctx);
return 0;
}