文章目录
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 职责链模式(三)抽象总结