zoukankan      html  css  js  c++  java
  • 设计模式-Visitor(行为模式) 一个类在不修改自己的同时增加了新的操作,存在问题是 1:破坏了封装性 2:扩展困难

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

    //Visitor.h

    #pragma once
    
    class ConcreateElementA;
    class ConcreateElementB;
    class Element;
    
    class Visitor
    {
    public:
        virtual ~Visitor();
        virtual void VisitConcreateElementA(Element* elm) = 0;
        virtual void VisitConcreateElementB(Element* elm) = 0;
    protected:
        Visitor();
    private:
    };
    
    class ConcreateVisitorA :public Visitor
    {
    public:
        ConcreateVisitorA();
        virtual ~ConcreateVisitorA();
        virtual void VisitConcreateElementA(Element* elm);
        virtual void VisitConcreateElementB(Element* elm);
    protected:
    private:
    };
    
    class ConcreateVisitorB :public Visitor
    {
    public:
        ConcreateVisitorB();
        virtual ~ConcreateVisitorB();
        virtual void VisitConcreateElementA(Element* elm);
        virtual void VisitConcreateElementB(Element* elm);
    protected:
    private:
    };

    //Element.h

    #pragma once
    
    class Visitor;
    
    class Element
    {
    public:
        virtual ~Element();
        virtual void Accept(Visitor* vis) = 0;
    protected:
        Element();
    private:
    };
    
    class ConcreateElementA :public Element
    {
    public:
        ConcreateElementA();
        ~ConcreateElementA();
        void Accept(Visitor* vis);
    protected:
    private:
    };
    
    class ConcreateElementB :public Element
    {
    public:
        ConcreateElementB();
        ~ConcreateElementB();
        void Accept(Visitor* vis);
    protected:
    private:
    };

    //Visitor.cpp

    #include"Element.h"
    #include"Visitor.h"
    
    #include<iostream>
    
    Visitor::Visitor(){}
    Visitor::~Visitor(){}
    ConcreateVisitorA::ConcreateVisitorA(){}
    ConcreateVisitorA::~ConcreateVisitorA(){}
    void ConcreateVisitorA::VisitConcreateElementA(Element* elm)
    {
        std::cout << "i will visit concreateElementA ... " << std::endl;
    }
    
    void ConcreateVisitorA::VisitConcreateElementB(Element* elm)
    {
        std::cout << "i will visit concreateElementB ..." << std::endl;
    }
    
    ConcreateVisitorB::ConcreateVisitorB(){}
    ConcreateVisitorB::~ConcreateVisitorB(){}
    
    void ConcreateVisitorB::VisitConcreateElementA(Element* elm)
    {
        std::cout << "i will visit ConcreateElementA ..." << std::endl;
    }
    
    void ConcreateVisitorB::VisitConcreateElementB(Element* elm)
    {
        std::cout << "i will visit ConcreateElementB ..." << std::endl;
    }

    //Element.cpp

    #include "Element.h"
    #include "Visitor.h"
    
    #include<iostream>
    
    Element::Element(){}
    Element::~Element(){}
    void Element::Accept(Visitor* vis){}
    
    ConcreateElementA::ConcreateElementA(){}
    ConcreateElementA::~ConcreateElementA(){}
    void ConcreateElementA::Accept(Visitor* vis)
    {
        vis->VisitConcreateElementA(this);
        std::cout << "Visitting ConcreateElementA ... " << std::endl;
    }
    
    ConcreateElementB::ConcreateElementB(){}
    ConcreateElementB::~ConcreateElementB(){}
    void ConcreateElementB::Accept(Visitor* vis)
    {
        vis->VisitConcreateElementB(this);
        std::cout << "Visitting ConcreateElementB ... " << std::endl;
    }

    //main.cpp

    #include"Element.h"
    #include"Visitor.h"
    #include<string>
    
    int main(int args, char* argv)
    {
        Visitor* vis = new ConcreateVisitorA();
        Element* elm = new ConcreateElementA();
        elm->Accept(vis);
        getchar();
        return 0;
    }
  • 相关阅读:
    AIBigKaldi(二)| Kaldi的I/O机制(源码解析)
    OfficialKaldi(十四)| 从命令行角度来看Kaldi的 I / O
    GNU Make函数、变量、指令
    C/C++编码规范(google)
    [English]precede, be preceded by
    视频压缩技术、I帧、P帧、B帧
    SMB
    printf占位符
    使用 Yocto Project 构建自定义嵌入式 Linux 发行版
    gcc fpic fPIC
  • 原文地址:https://www.cnblogs.com/fourmi/p/12089740.html
Copyright © 2011-2022 走看看