迭代子模式(Chain of Responsibility Pattern)
定义
责任链模式主要用于处理请求,将处理请求的对象连成链,每个请求处理者都有着自己的处理权限.
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求直到有一个对象处理它为止。
- Handler:定义一个处理请求的接口。一般还带一个设置下一个处理者的接口。
- ConcreteHandler:具体请求处理者,处理他负责处理的请求,或者将请求交给它的继承者。
常用场景
不同的请求需要不同权限的对象来处理的情况
优缺点
优点:
- 降低耦合度,将请求的发送者和接收者解耦。
- 简化了对象,使得对象不需要知道链的结构。
- 增加新的具体处理者很方便,无须修改原有代码,只需要在客户端重新建链即可。
缺点:
- 性能问题,每个请求都从头到尾遍历。
- 如果建链不当,可能会造成循环调用,这将导致系统陷入死循环
C++实现
举例:公司员工的请假流程
作为一个员工,在需要请假时需要发起流程,一般请假按请的时间长短需要跟不同级别的管理者请,就是请假这个请求根据时间长短可由不同的处理者处理,非常适合责任链模式
类图:
代码:
#include <iostream>
// 抽象处理基类
class Handle
{
public:
Handle() : m_pNextHandle(nullptr) {}
virtual ~Handle() {}
virtual void HandleRequest(unsigned short days) = 0;
void SetNextHandle(Handle* handle) { m_pNextHandle = handle;}
Handle* NextHandle() {return m_pNextHandle;}
private:
Handle* m_pNextHandle; // 下一个处理者
};
// 直接主管
class SuperIntendent : public Handle
{
public:
SuperIntendent() {}
~SuperIntendent() {}
void HandleRequest(unsigned short days)
{
std::cout << "请假 " << days << " 天 ---> ";
if (days <= 1)
{
std::cout << "主管: 同意了!" << std::endl;
}
else
{
std::cout << "主管: 向上申请! ---> ";
if (NextHandle())
NextHandle()->HandleRequest(days);
}
}
};
// 部门经理
class Manager : public Handle
{
public:
Manager() {}
~Manager() {}
void HandleRequest(unsigned short days)
{
if (days <= 3)
{
std::cout << "经理: 同意了!" << std::endl;
}
else
{
std::cout << "经理: 向上申请! ---> ";
if (NextHandle())
NextHandle()->HandleRequest(days);
}
}
};
// 老板
class Boss : public Handle
{
public:
Boss() {}
~Boss() {}
void HandleRequest(unsigned short days)
{
std::cout << "老板: 同意了!" << std::endl;
}
};
void ChainOfResponsibilityTest()
{
Handle* pSuperIntendent = new SuperIntendent;
Handle* pManager = new Manager;
Handle* pBoss = new Boss;
pSuperIntendent->SetNextHandle(pManager);
pManager->SetNextHandle(pBoss);
pSuperIntendent->HandleRequest(1);
pSuperIntendent->HandleRequest(3);
pSuperIntendent->HandleRequest(5);
delete pBoss;
delete pManager;
delete pSuperIntendent;
pSuperIntendent = nullptr;
pManager = nullptr;
pBoss = nullptr;
}