• 设计模式-Chain of Responsibility (行为模式) 降低系统的耦合性


    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码

    //Handle.h

    #pragma once
    
    class Handle
    {
    public:
        virtual ~Handle();
        virtual void HandleRequest() = 0;
        void SetSuccessor(Handle* succ);
        Handle* GetSuccessor();
    protected:
        Handle();
        Handle(Handle* succ);
    private:
        Handle* _succ;
    };
    
    class ConcreateHandleA :public Handle
    {
    public:
        ConcreateHandleA();
        ~ConcreateHandleA();
        ConcreateHandleA(Handle* succ);
        void HandleRequest();
    protected:
    private:
    };
    
    class ConcreateHandleB :public Handle
    {
    public:
        ConcreateHandleB();
        ~ConcreateHandleB();
        ConcreateHandleB(Handle* succ);
        void HandleRequest();
    protected:
    private:
    };

    //Handle.cpp

    #include"Handle.h"
    #include<iostream>
    
    Handle::Handle()
    {
        _succ = 0;
    }
    Handle::Handle(Handle* succ)
    {
        this->_succ = succ;
    }
    Handle::~Handle()
    {
        delete _succ;
    }
    
    void Handle::SetSuccessor(Handle* succ)
    {
        _succ = succ;
    }
    Handle* Handle::GetSuccessor()
    {
        return _succ;
    }
    void Handle::HandleRequest(){}
    
    ConcreateHandleA::ConcreateHandleA(){}
    ConcreateHandleA::~ConcreateHandleA(){}
    ConcreateHandleA::ConcreateHandleA(Handle* succ) :Handle(succ){}
    
    void ConcreateHandleA::HandleRequest()
    {
        if (this->GetSuccessor() != 0)
        {
            std::cout << "ConcreteHandleA 将处理权交给后继节点...." << std::endl;
            this->GetSuccessor()->HandleRequest();
        }
        else
        {
            std::cout << "ConcreteHandleA没有后继了,必须自己处理..." << std::endl;
        }
    }
    
    
    ConcreateHandleB::ConcreateHandleB(){}
    ConcreateHandleB::~ConcreateHandleB(){}
    ConcreateHandleB::ConcreateHandleB(Handle* succ) :Handle(succ){}
    
    void ConcreateHandleB::HandleRequest()
    {
        if (this->GetSuccessor() != 0)
        {
            std::cout << "ConcreteHandleB 将处理权交给后继节点..." << std::endl;
            this->GetSuccessor()->HandleRequest();
        }
        else
        {
            std::cout << "ConcreteHandleB 没有后继了,必须自己处理..." << std::endl;
        }
    }

    //main.cpp

    #include"Handle.h"
    #include<iostream>
    #include<string>
    
    int main(int args, char* argv)
    {
        Handle* h1 = new ConcreateHandleA();
        Handle* h2 = new ConcreateHandleB();
        h1->SetSuccessor(h2);
        h1->HandleRequest();
        getchar();
        return 0;
    }
  • 相关阅读:
    asp.net中的控件类型
    string、Empty和null三者的区别
    readonly和const的区别
    接口和抽象类的区别
    asp.net身份认证方式
    什么是继承
    dbca静默管理数据库&数据泵导出导入 大风起
    应用偶发性连接不上Oracle数据库的排查案例 大风起
    开源控件SourceGrid学习(附源代码)
    强类型与弱类型Dataset 与DataTable间的艰难选择
  • 原文地址:https://www.cnblogs.com/fourmi/p/12089910.html
Copyright © 2020-2023  润新知