zoukankan      html  css  js  c++  java
  • 设计模式-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;
    }
  • 相关阅读:
    C++指针
    C++ 结构体和枚举
    提供openssl -aes-256-cbc兼容加密/解密的简单python函数
    最新安全学习视频
    C++复合类型(结构体)
    C艹复合类型(字符串)
    C++复合类型(数组)
    python 搜索引擎Whoosh中文文档和代码 以及jieba的使用
    JSP基础之 C标签中的 varStatues属性
    JSP进阶 之 SimpleTagSupport 开发自定义标签
  • 原文地址:https://www.cnblogs.com/fourmi/p/12089910.html
Copyright © 2011-2022 走看看