职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这类对象链接成一条链,并沿着这条链传递请求,直到有对象处理它为止。

(1)Hander(抽象处理者)
定义了一个处理请求的接口;
(2)ConcreteHander(具体处理者)
处理它所负责的请求,如果可处理该请求,就处理掉这个请求;否则将该请求转发给它的下一个可以处理该请求的对象,所以它必须能访问它的下一个可以处理同样请求的对象;
(3)Client(客户类):
向处理对象提出具体的请求。
优点:
缺点:
请假审批系统实现。
- #include
- using namespace std;
- #define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
-
- //请求类 封装请求相关的信息
- class HolidayRequest
- {
- public:
- HolidayRequest(string leaveName, int leaveDays):m_leaveName(leaveName), m_leaveDays(leaveDays){};
- void setLeaveName(string leaveName) {
- m_leaveName = leaveName;
- }
- string getLeaveName(){
- return m_leaveName;
- }
-
- void setLeaveDays(int leaveDays){
- m_leaveDays = leaveDays;
- }
- int getLeaveDays(){
- return m_leaveDays;
- }
- private:
- string m_leaveName;
- int m_leaveDays;
- };
-
- //抽象处理者类 The holiday request handler interface
- class Manager
- {
- public:
- //抽象请求处理方法
- virtual bool HandleRequest(HolidayRequest *pRequest) = 0;
- };
-
- // 具体处理者 Project manager
- class PM : public Manager
- {
- public:
- PM(Manager *handler):m_pHandler(handler){};
- bool HandleRequest(HolidayRequest *pRequest)
- {
- if (pRequest->getLeaveDays() <= 3)
- {
- cout<<"PM said:OK."<
- cout << "leave name is " << pRequest->getLeaveName() << " and leave days is " << pRequest->getLeaveDays();
- return true;
- }
- else{
- if(m_pHandler != NULL){
- return m_pHandler->HandleRequest(pRequest);
- }
-
- }
- return false;
- }
- private:
- Manager *m_pHandler;
- };
-
-
- // 具体处理者 Department manager
- class DM : public Manager
- {
- public:
- DM(Manager *handler) : m_pHandler(handler){}
- bool HandleRequest(HolidayRequest *pRequest)
- {
- if (pRequest->getLeaveDays() <= 10){
- cout<<"DM said:OK."<
- cout << "leave name is " << pRequest->getLeaveName() << " and leave days is " << pRequest->getLeaveDays();
- return true;
- }
- else{
- if(m_pHandler != NULL){
- return m_pHandler->HandleRequest(pRequest);
- }
- }
- return false;
- }
- }
- private:
- Manager *m_pHandler;
- };
-
- //具体处理者 Project supervisor
- class PS : public Manager
- {
- public:
- PS(Manager *handler) : m_pHandler(handler){}
- bool HandleRequest(HolidayRequest *pRequest)
- {
- if (pRequest->getLeaveDays() <= 30){
- cout<<"DM said:OK."<
- cout << "leave name is " << pRequest->getLeaveName() << " and leave days is " << pRequest->getLeaveDays()<
- return true;
- }
- else{
- cout << "Exceed the maximum number of days off" ;
- return false;
- }
- return false;
- }
- private:
- Manager *m_pHandler;
- };
-
- int main()
- {
- //职责链创建
- DM *pDM = new DM(NULL);
- PS *pPS = new PS(pDM);
- PM *pPM = new PM(pPS);
- HolidayRequest *pHolidayRequest = new HolidayRequest("xiaoming",1);
-
- pPM->HandleRequest(pHolidayRequest);
- SAFE_DELETE(pHolidayRequest);
- pHolidayRequest = new HolidayRequest("xiaogang",5);
- pPM->HandleRequest(pHolidayRequest);
-
- SAFE_DELETE(pDM);
- SAFE_DELETE(pPS);
- SAFE_DELETE(pPM);
- SAFE_DELETE(pHolidayRequest);
- }
-
PM said:OK.
leave name is xiaoming and leave days is 1DM said:OK.
leave name is xiaogang and leave days is 5
参考文献:
-
相关阅读:
SpringMVC常用注解
vite+vue3+ts项目搭建之集成qiankun让其成为子应用模板(vite+vue3+ts+qiankun项目)
springboot萌宠宠物网店的开发与设计 毕业设计-附源码011042
Spring之AOP入门篇
11-stream流-流水线编码、filter等中间方法、forEach等终止方法、collect获取返回结果方法、lambda练习
mysql 位操作
Java中的运算符
别人都在这个春暖花开的端午节吃粽子,而我在踏青学springboot数据持久化
php Laravel 使用elasticsearch+ik中文分词器搭建搜索引擎
二叉树的遍历
-
原文地址:https://blog.csdn.net/kenjianqi1647/article/details/127870557