设计模式之责任链模式-做人要有点责任感!

一、责任链模式的概念

责任链模式也叫职责链模式,属于行为模式,该模式构造一系列分别担当不同职责的类对象,来共同完成一个任务, 这些类对象之间像链条一样紧密相连,所以被称作职责链模式。

二、责任链模式使用场景

1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、当需要向多个对象中的一个提交一个请求时,可以使用职责链模式。
3、可以动态指定一组对象处理请求时,可以使用职责链模式。

三、责任链模式构建方法

1、处理抽象类

处理抽象父类给处理具体类提供统一的共同接口和方法。

2、处理具体类

处理具体类继承处理抽象父类,用于实现处理抽象父类中的共同接口和方法。

四、责任链模式的示例

// ResponsibilityPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>

using namespace std;

#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}

// 员工请求类
class EmployeeRequest
{
public:

	void setRequestContent(string contentStr)
	{
		if (contentStr.empty())
		{
			return;
		}
		m_contentStr = contentStr;
	}

	string getRequestContent()
	{
		return m_contentStr;
	}

	void setRequestCount(int count)
	{
		if (count <= 0)
		{
			return;
		}
		m_count = count;
	}

	int getRequestCount()
	{
		return m_count;
	}

private:
	string m_contentStr;
	int m_count;
};

// 处理基类-管理者抽象类
class Manager
{
public:
	Manager *setNextManager(Manager *pManager)
	{
		if (pManager == nullptr)
		{
			return nullptr;
		}
		m_pManager = pManager;
		return pManager;
	}

	virtual void handleWork(EmployeeRequest *pEmployeeRequest) = 0;

protected:
	Manager *m_pManager;
};

// 处理具体类-管理者具体实现类
// 部门经理
class DepartManager : public Manager
{
public:
	virtual void handleWork(EmployeeRequest *pEmployeeRequest)
	{
		if ((pEmployeeRequest->getRequestContent()== "加薪") && pEmployeeRequest->getRequestCount() <=1000)
		{
			cout << "部门经理批准加薪:" << pEmployeeRequest->getRequestCount() << endl;
		}
		else
		{
			cout << "申请的数量太大,部门经理无权批准,传递给总监批准!" << endl;
			if (m_pManager != nullptr)
			{
				m_pManager->handleWork(pEmployeeRequest);
			}
		}
	}
};

// 总监
class MonitorManager : public Manager
{
public:
	virtual void handleWork(EmployeeRequest *pEmployeeRequest)
	{
		if ((pEmployeeRequest->getRequestContent() == "加薪") && pEmployeeRequest->getRequestCount() <= 5000)
		{
			cout << "总监批准加薪:" << pEmployeeRequest->getRequestCount() << endl;
		}
		else
		{
			cout << "申请的数量太大,总监无权批准,传递给总经理批准!" << endl;
			if (m_pManager != nullptr)
			{
				m_pManager->handleWork(pEmployeeRequest);
			}
		}
	}
};

// 总经理
class GeneralManager : public Manager
{
public:
	virtual void handleWork(EmployeeRequest *pEmployeeRequest)
	{
		if ((pEmployeeRequest->getRequestContent() == "加薪") && pEmployeeRequest->getRequestCount() <= 10000)
		{
			cout << "总经理批准加薪:" << pEmployeeRequest->getRequestCount() << endl;
		}
		else
		{
			cout << "申请的数量太大,总经理无权批准,传递给董事长批准!" << endl;
			if (m_pManager != nullptr)
			{
				m_pManager->handleWork(pEmployeeRequest);
			}
		}
	}
};

int main()
{
	cout << "------------------职责链模式-------------------" << endl;
	EmployeeRequest *pEmployeeRequest = new EmployeeRequest;
	pEmployeeRequest->setRequestContent("加薪");
	pEmployeeRequest->setRequestCount(3000);

	GeneralManager *pGeneralManager = new GeneralManager;
	MonitorManager *pMonitorManager = new MonitorManager;
	DepartManager *pDepartManager = new DepartManager;
	pDepartManager->setNextManager(pMonitorManager);
	pMonitorManager->setNextManager(pGeneralManager);
	
	pDepartManager->handleWork(pEmployeeRequest);

    std::cout << "Hello World!\n";
	getchar();
}

运行结果:
在这里插入图片描述

五、责任链模式的优缺点

优点:

1、责任的分担明确, 每个类只需要处理自己该处理的工作 ,明确各个类的责任范围。
2、降低耦合度,将请求的发送者和接收者进行解耦,类与类之间以松耦合的形式组织起来。
3、灵活性强,可以根据业务流程的变化进行自由组合对象链。

缺点:

1、处理时以链的形式在多个对象间传递消息,系统的性能有可能会受到影响,处理的速
度会变慢。

能力有限,如有错误,多多指教。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章