zoukankan      html  css  js  c++  java
  • C++实现责任链模式

    描述

      责任链模式,Chain of responsibility,是GoF中的behavior pattern行为模式中的一种,在所有的行为模式中,都设计的准则为:使用对象的组合而不是对象的继承。责任链模式所描述的是:与其从已有的类中继承新的类,不如让你的类指向一个你要使用的已经存在的类。该模式用于解耦发送请求的客户与处理请求的对象,实现方式为持有一系列的handler对象,每个对象都能处理特定的请求,如果某个handler不能处理该请求,它将请求传递给链中的下一个对象。在链的末端,会有一个或多个通用的(generic)handler,用于对请求的默认处理。

      该模式为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

    类图:

     

    例子

      下面的例子是一个客户服务系统,用于响应用户的不同请求,各个类的说明如下:

    • AbstractSupportHandler:抽象基类,用于作为处理请求的接口。如果特定等级的请求该类无法处理,则传递给下一个handler
    • ConcreteHandler(TechnicalSupportHandler, BillingSupportHandler, and GeneralSupportHandler):处理请求,或将请求传递给handler链中的下一个
    • Client(RequestorClient):发起请求

     代码:

    AbstractSupportHandler

    #ifndef _ABS_SUPPORT_HANDLER_H_
    #define _ABS_SUPPORT_HANDLER_H_
    
    #include <string>
    using std::string;
    
    //enum class HANDLEER_ENUM
    enum HANDLEER_ENUM
    {
        TECHNICAL = 0,
        BILLING = 1,
        GENERAL =2
    };
    
    class AbstractSupportHandler
    {
    public:
        AbstractSupportHandler();
        virtual ~AbstractSupportHandler(){}
    
        virtual void handleRequest(string message) = 0;
    
        //set next handler
        void setNextHandler(AbstractSupportHandler* handler)
        {
            this->m_nextHandler = handler;
        }
    
        //receive request
        void receiveRequest(int level, string message);
    
    protected:
        int level;
        AbstractSupportHandler* m_nextHandler;
    };
    
    #endif
    #include "AbstractSupportHandler.h"
    
    AbstractSupportHandler::AbstractSupportHandler()
    {
    }
    
    //receive request
    void AbstractSupportHandler::receiveRequest(int level, string message)
    {
        if (level >= this->level)
        {
            this->handleRequest(message);
        }
    
        if (this->m_nextHandler != nullptr)
        {
            this->m_nextHandler->receiveRequest(level, message);
        }
    }

    TechnicalSupportHandler:AbstractSupportHandler的子类

    #ifndef    _TECHNICAL_SUPPORT_HANDLER_H_
    #define _TECHNICAL_SUPPORT_HANDLER_H_
    
    #include "AbstractSupportHandler.h"
    
    class TechnicalSupportHandler : public AbstractSupportHandler
    {
    public:
        TechnicalSupportHandler(int level);
        ~TechnicalSupportHandler();
    
        void handleRequest(string message) override;
    };
    
    #endif
    #include "TechnicalSupportHandler.h"
    #include <iostream>
    
    using namespace std;
    
    TechnicalSupportHandler::TechnicalSupportHandler(int level)
    {
        this->level = level;
    }
    
    
    TechnicalSupportHandler::~TechnicalSupportHandler()
    {
    }
    
    
    void TechnicalSupportHandler::handleRequest(string message)
    {
        cout << "TechnicalSupportHandler: Processing request " + message << endl;
    }

      另外两个类:BillingSupportHandler、GeneralSupportHandler与此类似,省略。

    RequestorClient:

    #ifndef _REQUESTOR_CLIENT_H_
    #define _REQUESTOR_CLIENT_H_
    
    #include "AbstractSupportHandler.h"
    
    class RequestorClient
    {
    public:
        RequestorClient();
        ~RequestorClient();
    
        static AbstractSupportHandler* getHandlerChain();
    };
    
    #endif
    #include "RequestorClient.h"
    #include "TechnicalSupportHandler.h"
    #include "GeneralSupportHandler.h"
    #include "BillingSupportHandler.h"
    
    RequestorClient::RequestorClient()
    {
    }
    
    
    RequestorClient::~RequestorClient()
    {
    }
    
    AbstractSupportHandler* RequestorClient::getHandlerChain()
    {
        AbstractSupportHandler* technicalHandler = new TechnicalSupportHandler(HANDLEER_ENUM::TECHNICAL);
        AbstractSupportHandler* billingHandler = new BillingSupportHandler(HANDLEER_ENUM::BILLING);
        AbstractSupportHandler* generalHandler = new GeneralSupportHandler(HANDLEER_ENUM::GENERAL);
    
        technicalHandler->setNextHandler(billingHandler);
        billingHandler->setNextHandler(generalHandler);
    
        return technicalHandler;
    }

    main函数用于测试:

    #include <iostream>
    #include <stdlib.h>
    #include "AbstractSupportHandler.h"
    #include "RequestorClient.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        AbstractSupportHandler* handler = RequestorClient::getHandlerChain();
        handler->receiveRequest(HANDLEER_ENUM::TECHNICAL, "I'm having problem with my internet connectivity");
        cout << "==============================" << endl;
    
        handler->receiveRequest(HANDLEER_ENUM::BILLING, "Please resend my bill of this month.");
        cout << "==============================" << endl;
    
        handler->receiveRequest(HANDLEER_ENUM::GENERAL, "Please send any other plans for home users.");
    
        system("pause");
    }

    运行结果为::

     总结:

      责任链模式实现了发起请求的客户与处理请求的handler之间的完全解耦。在该模式中,第一个handler接收客户的请求,它要么处理该请求,要么将该请求传递给链中的下一个handler。在该门模式中,发起请求的client完全不知道哪个handler会处理它的请求,并且最终处理该请求的对象也不知道到底是谁发出的该请求。

    参考:

    https://springframework.guru/gang-of-four-design-patterns/chain-of-responsibility-pattern/

  • 相关阅读:
    hdu1087Super Jumping! Jumping! Jumping!(dp)
    划分树 hdu4417Super Mario
    poj2240Arbitrage(map+floyd)
    hdu4282A very hard mathematic problem
    hdu1421搬寝室(dp)
    【洛谷P3806】【模板】点分治1
    【CF914E】Palindromes in a Tree
    GDOI2020 游记
    【POJ2296】Map Labeler
    【洛谷P6623】树
  • 原文地址:https://www.cnblogs.com/zyk1113/p/13672591.html
Copyright © 2011-2022 走看看