• 设计模式-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;
    }
  • 相关阅读:
    HTML5超科幻个人主页
    用Java开发50个棋类游戏
    Android 4.2 project导入 5.0 SDK Eclipse 开发环境出现的问题总结
    蓝桥杯 地宫寻宝 带缓存的DFS
    HDU2577 How to Type【DP】
    Entity Framework 学习总结之一:ADO.NET 实体框架概述
    ASP.NET MVC4中调用WEB API的四个方法
    ASP.NET MVC Web API 学习笔记---第一个Web API程序
    ASP.Net MVC开发基础学习笔记(1):走向MVC模式
    MVC4笔记 Area区域
  • 原文地址:https://www.cnblogs.com/fourmi/p/12089740.html
Copyright © 2020-2023  润新知