文章目录
1. UML类图抽象
2. 实例
2.1 结果(结论先行)
main.cpp
#include "IHandler.h"
#include "ConcreteHandler1.h"
#include "ConcreteHandler2.h"
#include "ConcreteHandler3.h"
void test()
{
IHandler* ph1 = new ConcreteHandler1();
IHandler* ph2 = new ConcreteHandler2();
IHandler* ph3 = new ConcreteHandler3();
/* 设置请求的后继者 */
ph1->setSuccessor(ph2);
ph2->setSuccessor(ph3);
int arrRequsets[] = { 2,5,14,22,18,3,27,20 };
/* 循环给处理权限最小者提交请求,不同的数额,由不同的权限处理者来处理 */
for each (auto nRequest in arrRequsets)
{
ph1->handlerRequest(nRequest);
}
delete ph1;
delete ph2;
delete ph3;
ph1 = nullptr;
ph2 = nullptr;
ph3 = nullptr;
}
int main()
{
test();
system("pause");
return 0;
}
2.2 具体实现
2.2.1 IHandler.h
#pragma once
#include <iostream>
using namespace std;
/* 获取类名的宏 */
#define DECLARE_CLASS(name)\
public:\
virtual char* getClassName()\
{\
return #name;\
}
/* 定义的处理请求的接口类 */
class IHandler
{
public:
DECLARE_CLASS(IHandler)
public:
/* 设置处理请求的后继者 */
void setSuccessor(IHandler* pSuccessor) { m_pSuccessor = pSuccessor; }
/* 处理请求, nRequest表示请求的等级/类型/数量 */
virtual void handlerRequest(int nRequest) = 0;
protected:
IHandler* m_pSuccessor{ nullptr };//处理请求的后继者
};
2.2.2 ConcreteHandler1.h
#pragma once
#include "IHandler.h"
/*
具体处理类,处理它所负责的请求;
可访问它的后继者;
如果可处理该请求,就处理;否则将该请求转发给它的后继者。
*/
class ConcreteHandler1 :public IHandler
{
public:
DECLARE_CLASS(ConcreteHandler1)
public:
/* 处理请求, nRequest表示请求的等级/类型/数量 */
virtual void handlerRequest(int nRequest) override;
};
void ConcreteHandler1::handlerRequest(int nRequest)
{
/* 当且仅当请求数在[0,10)区间内有权处理,否则转交后继者 */
if (nRequest >= 0 && nRequest < 10)
{
cout << getClassName() << "\t处理请求\t" << nRequest << endl;
}
else if (nullptr != m_pSuccessor)
{
m_pSuccessor->handlerRequest(nRequest);
}
}
2.2.3 ConcreteHandler2.h
#pragma once
#include "IHandler.h"
/*
具体处理类,处理它所负责的请求;
可访问它的后继者;
如果可处理该请求,就处理;否则将该请求转发给它的后继者。
*/
class ConcreteHandler2 :public IHandler
{
public:
DECLARE_CLASS(ConcreteHandler2)
public:
/* 处理请求, nRequest表示请求的等级/类型/数量 */
virtual void handlerRequest(int nRequest) override;
};
void ConcreteHandler2::handlerRequest(int nRequest)
{
/* 当且仅当请求数在[10,20)区间内有权处理,否则转交后继者 */
if (nRequest >= 10 && nRequest < 20)
{
cout << getClassName() << "\t处理请求\t" << nRequest << endl;
}
else if (nullptr != m_pSuccessor)
{
m_pSuccessor->handlerRequest(nRequest);
}
}
2.2.4 ConcreteHandler3.h
#pragma once
#include "IHandler.h"
/*
具体处理类,处理它所负责的请求;
可访问它的后继者;
如果可处理该请求,就处理;否则将该请求转发给它的后继者。
*/
class ConcreteHandler3 :public IHandler
{
public:
DECLARE_CLASS(ConcreteHandler3)
public:
/* 处理请求, nRequest表示请求的等级/类型/数量 */
virtual void handlerRequest(int nRequest) override;
};
void ConcreteHandler3::handlerRequest(int nRequest)
{
/* 当且仅当请求数在[20,30)区间内有权处理,否则转交后继者 */
if (nRequest >= 20 && nRequest < 30)
{
cout << getClassName() << "\t处理请求\t" << nRequest << endl;
}
else if (nullptr != m_pSuccessor)
{
m_pSuccessor->handlerRequest(nRequest);
}
}
此为《大话设计模式》学习心得系列 P250~~
3. 职责链模式-相关链接
《大话设计模式》C++实现:24 职责链模式(一)请假加薪实例-初始版本
《大话设计模式》C++实现:24 职责链模式(二)请假加薪实例-改进