访问者设计模式

访问者设计模式

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()<<‘\n‘;

    }

    void visit(That *e)

    {

        cout<<"do up on"+e->that()<<‘\n‘;

    }void visit(TheOther *e)

    {

        cout<<"do up on"+e->theOther()<<‘\n‘;

    }

};

class DownVisitor:public Visitor{

    void visit(This *e)

    {

        cout<<"do down on"+e->thiss()<<‘\n‘;

    }

    void visit(That *e)

    {

        cout<<"do down on"+e->that()<<‘\n‘;

    }void visit(TheOther *e)

    {

        cout<<"do down on"+e->theOther()<<‘\n‘;

    }

};

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);

    }

}
时间: 2024-07-28 13:13:39

访问者设计模式的相关文章

Design Pattern Visitor 访问者设计模式

访问者设计模式是已经有了一组Person对象了,然后不同的访问者访问这组对象,会有不同效果. 这些访问者实际上就是一个可以让Person对象组执行的动作行为等. 至于这些Person对象是如何执行这些访问者的动作的,那是已经在特定的不同的Person对象中设计好的. 比如我们的访问者也许是一些动作集合的类,如: class Action { public: string present; string gun; virtual void drinkBeer(Person *p) = 0; vir

设计模式(33)-----行为型模式-----访问者设计模式

访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作. 介绍 意图:主要将数据结构与数据操作分离. 主要解决:稳定的数据结构和易变的操作耦合问题. 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封

设计模式-介绍

什么是设计模式? 设计模式是一个通过定义,使用和测试区解决特定问题的方法.在软件工程中,设计模式是一般只针对软件设计中在给定条件下回重复性发生的问题,提出的一种通用性的可重用解决方案.是用于描述在不同情况下解决问题的通用方法. 设计模式的分类 针对特定领域的设计模式: 用户界面设计模式 安全可用性模式 Web设计模式 商用模式设计模式 信息可视化设计模式 安全设计模式 GoF提出了23种设计模式,主要分为三大类型:创造型设计模式,结构型设计模式,行为型设计模式 创造型设计模式:注重于完成对象的实

Visitor设计模式

我猜想许多人都知道访问者设计模式,这种模式在“四人帮”的那本可复用面向对象软件基础的书被描述过.这个模式自身其实一点也不复杂(和以往的其他设计模式一样).  如上图所示: 我知道这个模式很久了,但是我至今都不需要它.Java通过本地方式处理多态:方法被调用时是基于调用这个方法的对象运行时的类型,而是不是基于调用对象编译时的类型. interface Animal{ void eat(); } public class Dog implements Animal { public void eat

设计模式(35)-----设计模式阶段性总结(一句话概括一个模式)

目录: 设计模式(1)------初始设计模式(回调函数) 设计模式要从语义上出发,而不要从语法上出发,其实设计模式归根结底就是多态的有计划的组合. 设计模式(2)------行为型模式------观察者设计模式 想想气象站,根据天气的变化动态的通知观众实时天气.当一个对象的状态改变时,通知另一个对象作出相应的改变,而中间的观察和通知者就是主要的观察者设计模式.出版者+订阅者=观察者模式 设计模式(3)------行为型模式------观察者设计模式(jdk自带) 设计模式(4)------结构

设计模式系列 - 行为型模式(下)

行为设计模式是识别对象之间的通信模式,行为模式涉及对象之间的责任分配,或者,将行为封装在对象中并将请求委托给它,也就是对象之间的关系. 涉及:* 状态模式中介模式* 观察者模式备忘录模式迭代器模式命令模式* 策略模式* 模板模式* 访客模式示例责任链模式 观察者模式 根据GoF定义,observer模式定义了对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖关系都会被自动通知和更新.它也被称为发布-订阅模式.在观察者模式中,有许多观察者(订阅者对象)正在观察特定的主题(发布者对象).观

Clang之语法抽象语法树AST

语法分析器的任务是确定某个单词流是否能够与源语言的语法适配,即设定一个称之为上下文无关语言(context-free language)的语言集合,语法分析器建立一颗与(词法分析出的)输入单词流对应的正确语法树.语法分析树的建立过程主要有两种方法:自顶向下语法分析法和自底向上分析法.AST作为语法分析树(parse tree)的一种简写方式,它独立于具体编程语言(C++.Java.C等),而且与语法分析树的建立过程无关(自顶向下和自底向上逻辑等价),是联系编译器前端.后端的重要接口.Clang的

Scala 的确棒

我的确认为计算机学院应该开一门 Scala 的语言课程. 在这篇文章中,我会讲述为什么我会有这样的想法,在此之前,有几点我想要先声明一下: 本文无意对编程语言进行评比,我要讲述的主体是为什么你应该学习 Scala.51CTO之前曾发布过一篇 Java 程序员为何要学习Scala的文章,可能也会对你有所帮助. 目前 Scala 有两个实现方式,一种是在 JVM(Java 虚拟机)上运行,另一种是在 CLR(Common Language Runtime 的缩写,即公共语言运行库)上运行.不过,JV

字节码分析与操作

1.1什么是字节码 https://zh.wikipedia.org/wiki/Java%E5%AD%97%E8%8A%82%E7%A0%81 Java所宣称的一次编译处处运行就是靠的字节码技术,java文件编译后会生成字节码文件.class,供jvm使用.字节码文件是由十六进制值组成,两个十六进制为一组,以一个字节为单位进行读取. 编译 javac *.java 反编译javap -c -verbose *.class 1.2.字节码结构 public class ByteCodeDemo {