• 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.效果

    • 降低耦合度    该模式使得一个对象无需知道是其他哪一个对象处理其请求。
    • 增强了给对象指派职责的灵活性    
    • 不保证被接受
  • 相关阅读:
    菜鸟记录:如何获取LOGINVIEW控件状态模板中的子控件
    无法安装dotnetFramework35sp1的解决方法
    MOSS2007小技巧:不用SPD轻松删除错误页面上的问题Webpart
    在动态页面里象静态页面一样控制整个网页的缓存和更新
    烦人的网页iframe去除
    经典sql注入教程
    自己写的后台静态权限验证类
    Asp.net项目从Vs2003转换到Vs2005的常见问题大全及解决方法
    C# 相当于ASP里Eval中的计算公式的方法(超简单的方法)
    1 UNIX与Linux的发展
  • 原文地址:https://www.cnblogs.com/mgp200866130/p/5616558.html
Copyright © 2020-2023  润新知