设计模式之ChainOfResponsibility职责链模式

模拟不同金额票据需要不同级别的领导审批流程:

  1. 金额0 ~ 10万含:Teamleader可处理,金额10 ~ 20万含:
  2. Supervisor可处理,金额20 ~ 50万含:
  3. Manager可处理,金额50 ~ 100万含:
  4. Boss可处理,金额超过100万,无人处理,

模拟缺点:请求没有一个明确的接收者,就不能保证它一定会被处理。

Handler(抽象处理者):AbstractHandler
ConcreteHandler(具体处理者):Teamleader、Supervisor、Manager、Boss
请求:Bill

1. 请求Bill

class Bill
{
public:
	Bill(int id, const std::string &name, double account)
	{
		this->m_iID = id;
		this->m_sName = name;
		this->m_dAccount = account;

		std::cout << "Bill 构造函数,id = " << this->m_iID << ",name = " << this->m_sName << ",account = " << this->m_dAccount << std::endl;
	}
	~Bill()
	{
		std::cout << "Bill 析构函数" << std::endl;
	}
	double getAccount()
	{
		return m_dAccount;
	}
	void showBill()
	{
		std::cout << "id = " << this->m_iID << ",name = " << this->m_sName << ",account = " << this->m_dAccount << std::endl;
	}
private:
	int m_iID;
	std::string m_sName;
	double m_dAccount;
};

2. Handler(抽象处理者)

class AbstractHandler
{
public:
	explicit AbstractHandler(const std::string &name)
	{
		setName(name);
	}
	virtual ~AbstractHandler() = default;

	//添加上级,职责链上的下一级处理者
	void setNextHandler(AbstractHandler *nextHandler)
	{
		m_pNextHandler = nextHandler;
	}
	//处理请求
	virtual void handleRequest(Bill *bill) = 0;
	std::string getName() {
		return m_sName;
	}
protected:
	AbstractHandler *m_pNextHandler;
private:
	void setName(const std::string &name)
	{
		this->m_sName = name;
	}
	std::string m_sName;
};

3. ConcreteHandler(具体处理者)

//依次逐级处理
///第一级:TeamLeader///
class TeamLeader : public AbstractHandler
{
public:
	explicit TeamLeader(const std::string &name)
		:AbstractHandler(name)
	{
		std::cout << "TeamLeader 构造函数," << name << std::endl;
	}
	~TeamLeader()
	{
		std::cout << "TeamLeader 析构函数" << std::endl;
	}

	//处理请求
	void handleRequest(Bill *bill) override
	{
		if (bill->getAccount() <= 10)
		{
			std::cout << "TeamLeader " << getName() << "处理了该票据,票据信息如下:" << std::endl;
			bill->showBill();
		}
		else {
			std::cout << "TeamLeader " << getName() << " 无权处理,转交上级" << std::endl;
			if (nullptr == m_pNextHandler) {
				std::cout << "票据无人处理,票据信息如下:" << std::endl;
				bill->showBill();
			}
			else {
				m_pNextHandler->handleRequest(bill);
			}
		}
	}

private:

};


///第二级:Supervisor///
class Supervisor : public AbstractHandler
{
public:
	explicit Supervisor(const std::string &name)
		:AbstractHandler(name)
	{
		std::cout << "Supervisor 构造函数," << name << std::endl;
	}
	~Supervisor()
	{
		std::cout << "Supervisor 析构函数" << std::endl;
	}

	//处理请求
	void handleRequest(Bill *bill) override
	{
		if (bill->getAccount() > 10 && bill->getAccount() <= 20)
		{
			std::cout << "Supervisor " << getName() << "处理了该票据,票据信息如下:" << std::endl;
			bill->showBill();
		}
		else {
			std::cout << "Supervisor " << getName() << " 无权处理,转交上级" << std::endl;
			if (nullptr == m_pNextHandler) {
				std::cout << "票据无人处理,票据信息如下:" << std::endl;
				bill->showBill();
			}
			else {
				m_pNextHandler->handleRequest(bill);
			}
		}
	}

private:

};


///第三级:Manager///
class Manager : public AbstractHandler
{
public:
	explicit Manager(const std::string &name)
		:AbstractHandler(name)
	{
		std::cout << "Manager 构造函数," << name << std::endl;
	}
	~Manager()
	{
		std::cout << "Manager 析构函数" << std::endl;
	}

	//处理请求
	void handleRequest(Bill *bill) override
	{
		if (bill->getAccount() > 20 && bill->getAccount() <= 50)
		{
			std::cout << "Manager " << getName() << "处理了该票据,票据信息如下:" << std::endl;
			bill->showBill();
		}
		else {
			std::cout << "Manager " << getName() << " 无权处理,转交上级" << std::endl;
			if (nullptr == m_pNextHandler) {
				std::cout << "票据无人处理,票据信息如下:" << std::endl;
				bill->showBill();
			}
			else {
				m_pNextHandler->handleRequest(bill);
			}
		}
	}

private:

};


///第四级:Boss///
class Boss : public AbstractHandler
{
public:
	explicit Boss(const std::string &name)
		:AbstractHandler(name)
	{
		std::cout << "Boss 构造函数," << name << std::endl;
	}
	~Boss()
	{
		std::cout << "Boss 析构函数" << std::endl;
	}

	//处理请求
	void handleRequest(Bill *bill) override
	{
		if (bill->getAccount() > 50 && bill->getAccount() <= 100)
		{
			std::cout << "Boss " << getName() << "处理了该票据,票据信息如下:" << std::endl;
			bill->showBill();
		}
		else {
			std::cout << "Boss " << getName() << " 无权处理,转交上级" << std::endl;
			if (nullptr == m_pNextHandler) {
				std::cout << "票据无人处理,票据信息如下:" << std::endl;
				bill->showBill();
			}
			else {
				m_pNextHandler->handleRequest(bill);
			}
		}
	}

private:

};

4. 主函数

int main()
{
	//请求处理者:张三, 李四, 王五, 赵六
	AbstractHandler *level1, *level2, *level3, *level4;

	level1 = new TeamLeader("张三");
	level2 = new Supervisor("李四");
	level3 = new Manager("王五");
	level4 = new Boss("赵六");
	std::cout << "=============== " << std::endl;

	//建立职责链的工作是在客户端进行
	level1->setNextHandler(level2);
	level2->setNextHandler(level3);
	level3->setNextHandler(level4);

	//创建单据
	Bill *bill1 = new Bill(1, "Bill_1", 8);
	Bill *bill2 = new Bill(2, "Bill_2", 15);
	Bill *bill3 = new Bill(3, "Bill_3", 99);
	Bill *bill4 = new Bill(4, "Bill_4", 44);
	Bill *bill5 = new Bill(5, "Bill_5", 150);
	std::cout << "=============== " << std::endl;
	
	//全部先交给 level1 TeamLeader 审批
	level1->handleRequest(bill1);
	std::cout << "=============== " << std::endl;
	level1->handleRequest(bill2);
	std::cout << "=============== " << std::endl;
	level1->handleRequest(bill3);
	std::cout << "=============== " << std::endl;
	level1->handleRequest(bill4);
	std::cout << "=============== " << std::endl;
	level1->handleRequest(bill5);
	std::cout << "=============== " << std::endl;


	delete level1; 
	delete level2; 
	delete level3; 
	delete level4;

	delete bill1;
	delete bill2;
	delete bill3;
	delete bill4; 
	delete bill5;


	getchar();

	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖七少爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值