《大话设计模式》C++实现:24 职责链模式(三)抽象总结

    科技2022-09-02  105

    文章目录

    1. UML类图抽象2. 实例2.1 结果(结论先行)2.2 具体实现2.2.1 IHandler.h2.2.2 ConcreteHandler1.h2.2.3 ConcreteHandler2.h2.2.4 ConcreteHandler3.h 3. 职责链模式-相关链接

    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 职责链模式(二)请假加薪实例-改进

    Processed: 0.009, SQL: 9