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;
    }
  • 相关阅读:
    15 鼠标事件
    09 属性操作
    06 DOM操作之插入节点
    03 如何处理多个库$冲突的问题
    01 jquery引入
    08 千千音乐盒实现全选和反选
    03 衣服相册切换效果
    02 显示和隐藏图片
    01 图片切换
    派生
  • 原文地址:https://www.cnblogs.com/fourmi/p/12089910.html
Copyright © 2011-2022 走看看