c++设计模式之职责链模式 学习笔记

职责链模式,如果用程序语言来近似描述,我理解为if else结构,感觉就是一级级的判断处理。不过将其封装成类的形式没有了if else的复杂分支,而且维护的时候也方便。
举个常见的例子:因为家里有事情处理,你需要向领导请13天的假。对于你来说,可能只需要在部门办公软件上填写申请,并提交给你的部门经理就可以了。但实际审批的话,是不是部门经理直接审批呢?肯定不是的。比如公司有规定:请假0-a天的时候你们部门经理可以直接审批;请假a-b天的时候需要研发总监审批 ;而请假天数>b天的时候则需要总经理审批。那实际上这个审批流程是怎样的呢?如果用if else的话,我知道你肯定是有答案了,但如果用职责链模式又该怎样设计呢?
因为这个模式相对好理解,这里不再啰嗦,直接上代码。

#include<iostream>
using namespace std;

//经理基类
class Manager
{
protected:
	Manager* m_manager;
public:
	Manager(Manager *manager) :m_manager(manager)
	{
		cout << "manager" << endl;
	}
	virtual ~Manager()
	{
		if (m_manager != NULL)
			delete m_manager;
		m_manager = NULL;
		cout << "~manager" << endl;
	}
	virtual void handle(int days) = 0;
};

//一级经理
class Manager_Level1: public Manager
{
public:
	Manager_Level1(Manager *maneger):Manager(maneger)
	{
		cout << "manager1" << endl;
	}
	~Manager_Level1()
	{
		if (this->m_manager != NULL)
		delete m_manager;
	this->m_manager = NULL;
	cout << "~manager1" << endl;
	}
public:
	void handle(int days)
	{
		if (days < 3)
		{
			cout << "我同意了,你可以去处理你的事情了" << endl;
		}
		else
		{
			cout << "你请假太多,我做不了主,得提交给我的上司" << endl;
			this->m_manager->handle(days);
		}
	}
};

//二级经理
class Manager_Level2 : public Manager
{
public:
	Manager_Level2(Manager *maneger) :Manager(maneger)
	{
		cout << "manager2" << endl;
	}
	~Manager_Level2()
	{
		if (this->m_manager != NULL)
			delete this->m_manager;
		this->m_manager = NULL;
		cout << "~manager2" << endl;
	}
public:
	void handle(int days)
	{
		if (days < 5)
		{
			cout << "我同意了,你可以去处理你的事情了" << endl;
		}
		else
		{
			cout << "你请假太多,我也做不了主,得提交给我的上司" << endl;
			this->m_manager->handle(days);
		}
	}
};

//三级经理
class Manager_Level3 : public Manager
{
public:
	Manager_Level3(Manager *maneger) :Manager(maneger)
	{
		cout << "manager3" << endl;
	}
	~Manager_Level3()
	{
		if (this->m_manager != NULL)
			delete this->m_manager;
		this->m_manager = NULL;
		cout << "~manager3" << endl;
	}
public:
	void handle(int days)
	{
		if (days < 10)
		{
			cout << "我同意了,你可以去处理你的事情了" << endl;
		}
		else
		{
			cout << "你请假太多了,公司没这个规定,你还是直接辞职吧" << endl;
		}
	}
};

void take()
{
	Manager *manager_3 = new Manager_Level3(NULL);
	Manager *manager_2 = new Manager_Level2(manager_3);
	Manager *manager_1 = new Manager_Level1(manager_2);
	manager_1->handle(13);
	delete manager_1;
	return;
}
void main()
{
	take();
	system("pause");
	return;
}

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值