C++行为型模式-职责链模式
创始人
2024-01-27 16:02:07
0

1.1 基本概念

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

1.2 模式结构

 (1)Hander(抽象处理者)

定义了一个处理请求的接口;

(2)ConcreteHander(具体处理者)

处理它所负责的请求,如果可处理该请求,就处理掉这个请求;否则将该请求转发给它的下一个可以处理该请求的对象,所以它必须能访问它的下一个可以处理同样请求的对象;

(3)Client(客户类):

向处理对象提出具体的请求。

1.3 优缺点

优点:

  • 处理者对于请求者完全透明,请求者无需事先知道谁来处理;
  • 它允许多与一个的处理者对象根据自己的逻辑来决定哪一个处理者最终处理这个命令,提高系统的扩展性;
  • 扩展灵活,新增具体请求者时无需修改原有系统的代码;
  • 责任链模式减低了发出命令的对象和处理命令的对象之间的耦合;

缺点:

  • 产生许多细颗粒对象;
  • 不一定能被处理,可能到末端也没被处理或者中间写错;
  • 比较长的责任链,可能涉及多个处理对象,性能问题,还有调试不方便;
  • 建链不当,可能造成循环调用,导致系统进入死循环;

1.4 应用场景

  1. 多个对象可以处理同一请求,但具体由哪个对象处理,则需要动态决定时。
  2. 在请求者不明确的情况下需要向多个对象中的一个提交请求时。
  3. 需要动态的指定一组对象处理请求时。
  4. 系统已经有一个由处理者对象组成的链。这个链可能由复合模式给出,
  5. 当系统想发出一个请求给多个处理者对象中的某一个,但是不明显指定是哪一个处理者对象会处理此请求。
  6. 当处理一个请求的处理者对象集合需要动态地指定时

1.5 举例

请假审批系统实现。

#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."<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."<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."<getLeaveName() <<  " and leave days is " << pRequest->getLeaveDays()<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
 

参考文献:

【1】C++设计模式之职责链模式(Chain of Responsibility)(行为型) | 码农家园

相关内容

热门资讯

小本创业投资项目2011年 小... 刚开始投资的时候可以试试小本投资,投资金额的大小决定了很多创业项目风险性,投资潜力,今天先为大家分享...
2011年在河北省小本创业投资... 从目前的创业项目看来,女性创业的项目:服装,小吃餐饮,化妆品等,偏门项目。1、想开服装店,如果是初次...
99年版100元值多少钱 99... 杨静国际项目融资经理,既有项目法人融资“往年高交会的主题‘坚持新开展理念、推进高质量开展’,以及以后...
小本创业致富好项目 不妨试试这... 餐饮粥火锅加盟重庆串串中式快餐品牌小型餐饮加盟小吃加盟铁锅焖面加盟中式快餐店十大咖啡品牌品牌快餐老火...
【烤肉创业】烤肉创业 十几张桌... 烤番薯加盟四川烤肉加盟烤吧加盟韩国烤肉加盟店烤面筋加盟正宗韩国烤肉加盟石板烤肉加盟烤猪脚加盟上海纸上...
2018年*新农村小本创业项目... 2018年*新农村小本创业项目有哪些呢?很多的创业者都想知道农村有哪些小本创业项目,但是不知道农村创...
这6个农村小本创业好项目 小本... ②小磨香油加工用小磨加工的香油、香油皮,具有色泽好、香味佳的特点,倍受城乡居民的青睐。开设香油加小加...
推荐几个靠谱的挣小本创业什么项... 人不能以挣钱为目的,但是又有谁不是在为挣钱而做着不同的努力呢。上班族整天辛苦的加班,但是工资报酬并不...
宝妈可以做的靠谱的小本创业项目... 随着现在科技技术的进步,我们喜欢用照片记录生活,不管是一个人的臭美,还是美美的旅游,和朋友的欢畅聚会...
小本创业干些什么好 个人小本创... 小本创业适合做些什么?无本创业项目有哪些呢?创业就是无际的天空,平时想要创业的人士们,想创业但残酷的...