• Chain Of Responsibility(职责连)-对象行为型模式


    1.意图

        使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    2.动机

        给多个对象处理一个请求的机会,从而解耦发送者和接收者。

    3.适用性

    • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    • 可处理一个请求的对象集合应被动态指定。

    4.结构

        

    5.代码实例

        

    //Handler.h
    #include <memory>
    
    class AbstractHandler
    {
    public:
        virtual void HandleRequest() = 0;
        virtual void SetHandler(std::shared_ptr<AbstractHandler> pHandler);
    protected:
        std::shared_ptr<AbstractHandler> m_pHandler;
    };
    
    
    class BaseHandler : public AbstractHandler
    {
    public:
        virtual void HandleRequest();
    };
    
    
    class ConcreteHandler1 : public BaseHandler
    {
    public:
         void HandleRequest();
    };
    
    class ConcreteHandler2 : public BaseHandler
    {
    public:
         void HandleRequest();
    };
    //Handler.cpp
    #include <iostream>
    #include "Handler.h"
    
    
    void AbstractHandler ::SetHandler(std::shared_ptr<AbstractHandler> pHandler)
    {
        m_pHandler = pHandler;
    };
    
    void BaseHandler ::HandleRequest()
    {
        std::cout << "Base Handler Handled" << std::endl;
    };
    
    void ConcreteHandler1 ::HandleRequest()
    {
        std::cout << "ConcreteHandler1 Handled" << std::endl;
        m_pHandler->HandleRequest();
    };
    
    void ConcreteHandler2 ::HandleRequest()
    {
        std::cout << "ConcreteHandler2 Handled" << std::endl;
        m_pHandler->HandleRequest();
    };
    //client
    
    
    
    #include "Handler.h"
    
    int main()
    {
    
        std::shared_ptr <AbstractHandler> pConcreteHandler1(new ConcreteHandler1);
    
        std::shared_ptr <AbstractHandler> pConcreteHandler2(new ConcreteHandler2);
    
        std::shared_ptr <AbstractHandler> pBaseHandler(new BaseHandler);
    
        pConcreteHandler1->SetHandler(pConcreteHandler2);
    
        pConcreteHandler2->SetHandler(pBaseHandler);
    
        pConcreteHandler1->HandleRequest();
    
    
        while(1);
    
    
    }

    6.测试结果

        

    以上结果为每个handler执行后均调用上一级的handler执行。

    7.效果

    • 降低耦合度    该模式使得一个对象无需知道是其他哪一个对象处理其请求。
    • 增强了给对象指派职责的灵活性    
    • 不保证被接受
  • 相关阅读:
    .Net Core Swagger配置
    MySQL如何使用索引
    一个HTTP Basic Authentication引发的异常
    跑步花钱吗?
    跑步花钱吗?
    OpenShift中的持续交付
    在AWS中部署OpenShift平台
    壮美大山包-2017中国大山包国际超百公里ITRA积分赛赛记
    膝盖中了一箭之康复篇-两周年纪念
    HashiCorp Vault介绍
  • 原文地址:https://www.cnblogs.com/mgp200866130/p/5616558.html
Copyright © 2020-2023  润新知