前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大话设计模式15-职责链模式-2021-1-12

大话设计模式15-职责链模式-2021-1-12

作者头像
用户7719114
发布2022-02-22 13:29:07
1260
发布2022-02-22 13:29:07
举报
文章被收录于专栏:C++小白

文章目录

一、职责链模式是什么?

使得多个对象都有机会处理请求,避免请求的发送者和接收者之间的耦合关系。将对象连成一个链条,请求按照链条传递,直到可处理为止。

二、代码实现

代码如下(示例):

代码语言:javascript
复制
//15.职责链条模式
enum REQUEST_TYPE
{
	REQUEST_ASK_FOR_LEAVE=0,
	REQUEST_ADD_SALARY
};
typedef struct _request
{
	string text;
	REQUEST_TYPE type;
	int num;     //天数或者薪水
}Request;

class Manager
{
public:
	Manager(string istrName) :m_strName(istrName){};
	void setSuperior(Manager *ipSuperior)
	{
		m_pSuperior = ipSuperior;
	}
	virtual void processRequest(Request iRequest) = 0;
protected:
	Manager *m_pSuperior;  //上级
	string m_strName;
};
class CommonManager :public Manager
{
public:
	CommonManager(string istrName) :Manager(istrName){};
	void processRequest(Request iRequest) override
	{
		if (iRequest.type==REQUEST_ASK_FOR_LEAVE&&iRequest.num<=2)
		{
			cout << m_strName << "批准" << iRequest.text << iRequest.num << endl;
		}
		else
		{
			if (m_pSuperior)
			{
				m_pSuperior->processRequest(iRequest);
			}
		}
	}
};

class Majordomo :public Manager
{
public:
	Majordomo(string istrName) :Manager(istrName){};
	void processRequest(Request iRequest) override
	{
		if (iRequest.type == REQUEST_ASK_FOR_LEAVE&&iRequest.num <= 5)
		{
			cout << m_strName << "批准" << iRequest.text << iRequest.num << endl;
		}
		else
		{
			if (m_pSuperior)
			{
				m_pSuperior->processRequest(iRequest);
			}
		}
	}
};

class GeneralManager :public Manager
{
public:
	GeneralManager(string istrName) :Manager(istrName){};
	void processRequest(Request iRequest) override
	{
		if (iRequest.type == REQUEST_ASK_FOR_LEAVE)
		{
			cout << m_strName << "批准" << iRequest.text << iRequest.num << endl;
		}
		else if (iRequest.type == REQUEST_ADD_SALARY&&iRequest.num <= 500)
		{
			cout << m_strName << "批准" << iRequest.text << iRequest.num << endl;
		}
		else
		{
			cout << m_strName << "暂不批准" << iRequest.text << iRequest.num << endl;
		}
	}
};
int main()
{
	Request request;
	request.text = "小宋请假";
	request.type = REQUEST_ASK_FOR_LEAVE;
	request.num = 30;
	CommonManager *pCommonManager = new CommonManager("www");
	Majordomo *pMajordomo = new Majordomo("yyy");
	GeneralManager *pGeneralManager = new GeneralManager("lll");
	pCommonManager->setSuperior(pMajordomo);
	pMajordomo->setSuperior(pGeneralManager);
	pCommonManager->processRequest(request);
	delete pCommonManager;
	delete pMajordomo;
	delete pGeneralManager;
	system("pause");
}

总结

<font color=#999AAA 暂无

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、职责链模式是什么?
  • 二、代码实现
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档