zoukankan      html  css  js  c++  java
  • 访问者设计模式

    访问者设计模式

    1.在”element“里面添加一个accept(Visitor)方法

    2、创建一个”visitor”基类 ,并且为每一个”element创建一个visit()方法。

    3、创建一个visitor的派生类然后执行相应的”elements”操作。

    4、客户端创建”visitor”对象并且根据传入的类型来调用 相应的accept();

     

     

    //
    
    //  main.cpp
    
    //  visitor_Design_pattern
    
    //
    
    //  Created by apple on 15/5/24.
    
    //  Copyright (c) 2015年 apple. All rights reserved.
    
    //
    
     
    
    #include <iostream>
    
    #include <string>
    
    using namespace std;
    
    //1、在"element"类中添加一个accept(visitor)方法
    
    class Element{
    
    public:
    
        virtual void accept(class Visitor &v)=0;
    
    };
    
    class This: public Element
    
    {
    
    public:
    
        /*虚函数*/void accept(Visitor &v);
    
        string thiss()
    
        {
    
            return "This";
    
        }
    
    };
    
    class That:public Element{
    
    public:
    
        /*虚函数*/ void accept(Visitor &v);
    
        string that(){
    
            return "That";
    
        }
    
    };
    
    class TheOther:public Element{
    
    public:
    
       /*虚函数*/  void accept(Visitor &v);
    
        string theOther(){
    
            return "TheOther";
    
        }
    
    };
    
    //2.创建 一个Vistor的基类,根据"element“的类型来执行相应的visit()方法
    
    class Visitor{
    
    public:
    
        virtual void visit(This *e)=0;
    
        virtual void visit(That *e)=0;
    
        virtual void visit(TheOther *e)=0;
    
    };
    
    void This::accept(Visitor &v){
    
        v.visit(this);
    
    }
    
    void That::accept(Visitor &v)
    
    {
    
        v.visit(this);
    
    }
    
     
    
    void TheOther::accept(Visitor &v)
    
    {
    
        v.visit(this);
    
    }
    
    //3、创建一个"visitor"派生类来实现具体的"elements”的操作
    
    class upVisitor:public Visitor{
    
        void visit(This *e)
    
        {
    
            cout<<"do up on"+e->thiss()<<'
    ';
    
        }
    
        void visit(That *e)
    
        {
    
            cout<<"do up on"+e->that()<<'
    ';
    
        }void visit(TheOther *e)
    
        {
    
            cout<<"do up on"+e->theOther()<<'
    ';
    
        }
    
    };
    
    class DownVisitor:public Visitor{
    
        void visit(This *e)
    
        {
    
            cout<<"do down on"+e->thiss()<<'
    ';
    
        }
    
        void visit(That *e)
    
        {
    
            cout<<"do down on"+e->that()<<'
    ';
    
        }void visit(TheOther *e)
    
        {
    
            cout<<"do down on"+e->theOther()<<'
    ';
    
        }
    
    };
    
    int main(int argc, const char * argv[]) {
    
        Element *list[]={
    
            new This(),new That(),new TheOther()
    
        };
    
        upVisitor up;//客户端创建
    
        DownVisitor down;
    
        for (int i=0; i<3; i++)
    
            list[i]->accept(up);
    
        for (int i=0; i<3; i++) {
    
            list[i]->accept(down);
    
        }
    
       
    
    }
  • 相关阅读:
    寒江独钓(0):内核开发上机指导
    异常:Hibernate数据库恢复错误
    天书夜读:从汇编语言到Windows内核编程笔记(4)
    企业WEBGIS网站解决方案
    如何使用国际开源项目构建一个完整的GIS(地理信息)应用系统
    将指定文件夹下的所有文件copy到目标文件夹下
    一些jquery的小知识
    压缩指定目录下指定文件(包括子目录下的文件)
    解压一个rar文件
    关于下载txt文本文挡的问题
  • 原文地址:https://www.cnblogs.com/tianyake/p/4525575.html
Copyright © 2011-2022 走看看