【25】c++设计模式——>责任链模式
责任链模式定义
C++中的责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求沿着处理对象的链传递来避免把请求发送者与接收者耦合在一起。
责任链模式的主要思想是,通过将多个处理对象组成一条链,每个处理对象都有机会处理请求。如果某个对象不能处理请求,则将请求传递给下一个对象依次处理,直到请求被处理为止。
责任链模式通常涉及以下几个角色:
1.请求(request):封装了需要进行处理的信息,以便于在责任链上传递。
2.抽象处理者(Handler):定义了处理请求的接口,并维护一个指向下一个处理者的引用,以便于在责任链中传递请求。
3.具体处理者(Concrete Handler):实现了处理请求的方法,并检查是否有足够的权限或能力来处理请求。如果可以处理请求,则进行处理并返回结果;否则将请求传递给下一个处理者。
使用责任链模式的主要目的是让不同的处理对象负责不同的处理逻辑,并将这些对象串成一条链。这样一来,我们可以动态地改变请求的处理顺序或重新配置责任链,而不影响客户端代码。
实例代码
OA系统实例,分别有普通员工,主管,CEO,boss,处理的请求有请假,涨薪, 辞职;普通员工提交请求,主管可以批准请假,CEO可以批准请假,涨薪,boss可以批准请假,涨薪,辞职。
主管处理不了的递交给CEO,CEO处理不了的递交给boss。
#include <iostream>
using namespace std;enum class RequestType :char {qingjia,zhangxin,cizhi};
//抽象管理者类,manager,ceo,boss都继承这个类
class AbstractManager
{
public:void setNext(AbstractManager* next) //指向下一个管理者{m_next = next;}virtual void handleRequest(RequestType type) = 0; //每个管理者都要重写这个处理请求的函数virtual ~AbstractManager() {}
protected:AbstractManager* m_next = nullptr; //子类可以继承
};//manager主管
class Manager : public AbstractManager
{
public:void handleRequest(RequestType type) //每个管理者都要重写这个处理请求的函数{switch (type){case RequestType::qingjia:cout << "请假:同意" << endl;break;case RequestType::zhangxin:cout << "涨薪:我要请示CEO" << endl;m_next->handleRequest(type); //m_next是下个界别的对象指针break;case RequestType::cizhi:cout << "辞职:我要请示上级" << endl;m_next->handleRequest(type); //m_next是下个界别的对象指针break;default:break;}}
};//CEO
class CEO : public AbstractManager
{
public:void handleRequest(RequestType type) //每个管理者都要重写这个处理请求的函数{switch (type){case RequestType::qingjia:cout << "请假:同意" << endl;break;case RequestType::zhangxin:cout << "再等等吧" << endl;break;case RequestType::cizhi:cout << "辞职:我要请示上级" << endl;m_next->handleRequest(type); //m_next是下个界别的对象指针break;default:break;}}
};//boss
class BOSS : public AbstractManager
{
public:void handleRequest(RequestType type) //每个管理者都要重写这个处理请求的函数{switch (type){case RequestType::qingjia:cout << "请假:再忍忍吧" << endl;break;case RequestType::zhangxin:cout << "再等等吧" << endl;break;case RequestType::cizhi:cout << "辞职:再缓一缓吧" << endl;break;default:break;}}
};//请假人的类
class YG
{
public:void request(RequestType type, AbstractManager* manager){manager->handleRequest(type);}
};int main()
{Manager* manager = new Manager;CEO* ceo = new CEO;BOSS* boss = new BOSS;manager->setNext(ceo);ceo->setNext(boss);YG* yg = new YG;yg->request(RequestType::qingjia, manager);yg->request(RequestType::zhangxin, manager);yg->request(RequestType::cizhi, manager);yg->request(RequestType::qingjia, ceo);yg->request(RequestType::zhangxin, ceo);yg->request(RequestType::cizhi, ceo);yg->request(RequestType::qingjia, boss);yg->request(RequestType::zhangxin, boss);yg->request(RequestType::cizhi, boss);return 0;}