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;
    }
  • 相关阅读:
    [Java123] 方法重载中遇到的编译器错误: both methods have same erasure => 引入Java泛型type erasure
    [Java123] 认识JavaBean
    [Java123] HashMap实现和应用
    [Java123] 开源工具guava比较器链ComparisonChain (附加比较null空值的实现方法)
    [Java123] Java的异常处理机制
    [ORACLE123] sysdate处理
    Linux进程实时可视化监控
    【Java123】ThreadLocal学习笔记
    【XML123】了解XMLUnit
    字符串%s
  • 原文地址:https://www.cnblogs.com/fourmi/p/12089910.html
Copyright © 2011-2022 走看看