设计模式之责任链模式-做人要有点责任感!
一、责任链模式的概念
责任链模式也叫职责链模式,属于行为模式,该模式构造一系列分别担当不同职责的类对象,来共同完成一个任务, 这些类对象之间像链条一样紧密相连,所以被称作职责链模式。
二、责任链模式使用场景
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、处理时以链的形式在多个对象间传递消息,系统的性能有可能会受到影响,处理的速
度会变慢。
能力有限,如有错误,多多指教。。。
本文为博主原创文章,未经博主允许请勿转载!作者:ISmileLi