《大话设计模式》C++实现:24 职责链模式(二)请假加薪实例-改进

1. UML类图

在这里插入图片描述

2. 实例

2.1 结果(结论先行)

在这里插入图片描述
main.cpp

#include "IManager.h"
#include "CommonManager.h"
#include "Majordomo.h"
#include "GeneralManager.h"
#include "Request.h"

void test()
{
	/* 三个管理者 */
	IManager* pm1 = new CommonManager();//经理
	IManager* pm2 = new Majordomo();//总监
	IManager* pm3 = new GeneralManager();//总经理

	/* 设置后继者(直系上级) */
	pm1->setSuperior(pm2);
	pm2->setSuperior(pm3);

	/* 请求 */
	Request* pR1 = new Request("请假", "Leo申请请假", 1);
	Request* pR2 = new Request("请假", "Leo申请请假", 4);
	Request* pR3 = new Request("加薪", "Leo申请加薪", 500);
	Request* pR4 = new Request("加薪", "Leo申请加薪", 1000);
	Request* arrRequest[] = { pR1,pR2,pR3,pR4 };

	/* 循环处理令权限最低的pm1处理请求,无法处理则上报上级 */
	for each (auto pRequest in arrRequest)
	{
		pm1->dealRequest(pRequest);
	}

	/* 析构 */
	delete pm1;
	delete pm2;
	delete pm3;
	pm1 = nullptr;
	pm2 = nullptr;
	pm3 = nullptr;
	for each (auto pRequest in arrRequest)
	{
		delete pRequest;
		pRequest = nullptr;
	}
}

int main()
{
	test();
	system("pause");
	return 0;
}

2.2 具体实现

2.2.1 Request.h

见:《大话设计模式》C++实现:24 职责链模式(一)请假加薪实例-初始版本 的 4.2.1 Request.h

2.2.2 IManager.h
#pragma once
#include "Request.h"
#include <iostream>

/* 获取类名的宏 */

#define  DECLARE_CLASS(name)\
public:\
	virtual char* getClassName()\
    {\
	      return #name;\
	}

class IManager
{
public:
	DECLARE_CLASS(IManager)
public:
	/* 设置后继者(直系上级) */
	void setSuperior(IManager* pm) { m_pSuccessor = pm; }
	/* 处理请求 */
	virtual void dealRequest(Request* pRequest) = 0;
protected:
	IManager* m_pSuccessor{ nullptr };//处理请求的后继者(上级)
};

2.2.3 CommonManager.h
#pragma once
#include "IManager.h"

/* 经理 */

class CommonManager :public IManager
{
public:
	DECLARE_CLASS(CommonManager)
public:
	virtual void dealRequest(Request* pRequest) override;
};

void CommonManager::dealRequest(Request* pRequest)
{
	if (pRequest->getType() == "请假" && pRequest->getNum() <= 2)
	{
		cout << getClassName() << ":\t" << pRequest->getContent() << "\t数量" << pRequest->getNum() << "\t被批准" << endl;
	}
	else
	{
		if (nullptr != m_pSuccessor)
		{
			m_pSuccessor->dealRequest(pRequest);
		}
	}
}

2.2.4 Majordomo.h
#pragma once
#include "IManager.h"

/* 总监 */

class Majordomo :public IManager
{
public:
	DECLARE_CLASS(Majordomo)
public:
	virtual void dealRequest(Request* pRequest) override;
};

void Majordomo::dealRequest(Request* pRequest)
{
	if (pRequest->getType() == "请假" && pRequest->getNum() <= 5)
	{
		cout << getClassName() << ":\t" << pRequest->getContent() << "\t数量" << pRequest->getNum() << "\t被批准" << endl;
	}
	else
	{
		if (nullptr != m_pSuccessor)
		{
			m_pSuccessor->dealRequest(pRequest);
		}
	}
}

2.2.5 GeneralManager.h
#pragma once
#include "IManager.h"

/* 总经理 */

class GeneralManager :public IManager
{
public:
	DECLARE_CLASS(GeneralManager)
public:
	virtual void dealRequest(Request* pRequest) override;
};

void GeneralManager::dealRequest(Request* pRequest)
{
	if (pRequest->getType() == "请假")
	{
		cout << getClassName() << ":\t" << pRequest->getContent() << "\t数量" << pRequest->getNum() << "\t被批准" << endl;
	}
	else if (pRequest->getType() == "加薪" && pRequest->getNum() <= 500)
	{
		cout << getClassName() << ":\t" << pRequest->getContent() << "\t数量" << pRequest->getNum() << "\t被批准" << endl;
	}
	else if (pRequest->getType() == "加薪" && pRequest->getNum() > 500)
	{
		cout << getClassName() << ":\t" << pRequest->getContent() << "\t数量" << pRequest->getNum() << "\t再说吧" << endl;
	}
	//目前代码中,总监没有后继者(上级)了
}

此为《大话设计模式》学习心得系列 P252~~

3. 职责链模式-相关链接

《大话设计模式》C++实现:24 职责链模式(一)请假加薪实例-初始版本
《大话设计模式》C++实现:24 职责链模式(三)抽象总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值