1. 作用
责任链模式主要用于处理请求,将处理请求的对象连成链,每个请求处理者都有着自己的处理权限.
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求直到有一个对象处理它为止。
2. UML类图
参与者:
- Handler:定义一个处理请求的接口。一般还带一个设置下一个处理者的接口。
- ConcreteHandler:具体请求处理者,处理他负责处理的请求,或者将请求交给它的继承者。
3. 实现
- 举例:请假是我们日常生活中经常遇到的事,一般请假按请的时间长短需要跟不同级别的管理者请,就是请假这个请求根据时间长短可由不同的处理者处理,非常适合责任链模式。
- 代码:
#include <iostream>
using namespace std;
//抽象处理者
class Handler
{
public:
Handler() { m_pNextHandler = NULL; }
virtual ~Handler() {}
//设置下一个处理者
void SetNextHandler(Handler *successor) { m_pNextHandler = successor; }
//处理请求
virtual void HandleRequest(int days) = 0;
protected:
Handler *m_pNextHandler; // 后继者
};
//具体处理者、主管
class Director :public Handler
{
public:
//处理请求
virtual void HandleRequest(int days)
{
if (days <= 1)
{
cout << "我是主管,有权批准一天假,同意了!" << endl;
}
else
{
m_pNextHandler->HandleRequest(days);
}
}
};
//具体处理者、经理
class Manager :public Handler
{
public:
//处理请求
virtual void HandleRequest(int days)
{
if (days <= 3)
{
cout << "我是经理,有权批准三以下的假,同意了!" << endl;
}
else
{
m_pNextHandler->HandleRequest(days);
}
}
};
//具体处理者、老板
class Boss :public Handler
{
public:
//处理请求
virtual void HandleRequest(int days)
{
if (days <= 7)
{
cout << "我是老板,最多让你请7天假,同意了!" << endl;
}
else
{
cout << "你请的假事假太长了,不同意!" << endl;
}
}
};
//场景
int main()
{
Handler *director = new Director;
Handler *manager = new Manager;
Handler *boss = new Boss;
//设置责任链
director->SetNextHandler(manager);
manager->SetNextHandler(boss);
director->HandleRequest(1);
director->HandleRequest(2);
director->HandleRequest(5);
director->HandleRequest(8);
return 0;
}
结果:
我是主管,有权批准一天假,同意了!
我是经理,有权批准三以下的假,同意了
我是老板,最多让你请7天假,同意了!
你请的假事假太长了,不同意!
请按任意键继续. . .
4. 优缺点
- 优点:
降低耦合度,将请求的发送者和接收者解耦。
简化了对象,使得对象不需要知道链的结构。
增加新的具体处理者很方便,无须修改原有代码,只需要在客户端重新建链即可。 - 缺点:
性能问题,每个请求都从头到尾遍历。
如果建链不当,可能会造成循环调用,这将导致系统陷入死循环
5. 适用场景
不同的请求需要不同权限的对象来处理的情况。
6. 总结
责任链模式应用场景很明显,需要将请求层层传递给不同的处理者的时候就用它吧。