Visitor

#include <iostream>
#include <vector>

using namespace std;

#define DESTROY_POINTER(ptr) if (ptr) { delete ptr; ptr = NULL; }

class Element;

class Visitor
{
public:
    virtual void Visit(Element* pElement)=0;
};

class ConcreteVisitorA : public Visitor
{
public:
    void Visit(Element* pElement);
};

class ConcreteVisitorB : public Visitor
{
public:
    void Visit(Element* pElement);
};

class Element
{
public:
    virtual void Accept(Visitor* pVisitor)=0;
    virtual void Interface1()=0;
    virtual void Interface2()=0;
};

class ConcreteElementA : public Element
{
public:
    void Accept(Visitor* pVisitor)
    {
        pVisitor->Visit(this);
    }
    void Interface1() { cout<<"ConcreteElementA::Interface1"<<endl; }
    void Interface2() { cout<<"ConcreteElementA::Interface2"<<endl; }
};

class ConcreteElementB : public Element
{
public:
    void Accept(Visitor* pVisitor)
    {
        pVisitor->Visit(this);
    }
    void Interface1() { cout<<"ConcreteElementB::Interface1"<<endl; }
    void Interface2() { cout<<"ConcreteElementB::Interface2"<<endl; }
};

void ConcreteVisitorA::Visit(Element* pElement)
{
    pElement->Interface1();
}

void ConcreteVisitorB::Visit(Element* pElement)
{
    pElement->Interface2();
}

class Structure
{
public:
    virtual ~Structure()
    {
        for (unsigned int i = 0; i < m_elementList.size(); i++)
        {
            delete m_elementList[i];
        }
        m_elementList.clear();
    }

    void Accept(Visitor* pVisitor)
    {
        for (unsigned int i = 0; i < m_elementList.size(); i++)
        {
            m_elementList[i]->Accept(pVisitor);
        }
    }

    void AddElement(Element* pElement)
    {
        m_elementList.push_back(pElement);
    }
private:
    vector<Element*> m_elementList;
};

int main(int argc, char *argv[])
{
    Structure structure;

    structure.AddElement(new ConcreteElementA);
    structure.AddElement(new ConcreteElementB);

    Visitor* pVisitorA = new ConcreteVisitorA;
    Visitor* pVisitorB = new ConcreteVisitorB;

    structure.Accept(pVisitorA);
    structure.Accept(pVisitorB);

    DESTROY_POINTER(pVisitorA);
    DESTROY_POINTER(pVisitorB);

    return 0;
}
时间: 2024-10-01 05:01:52

Visitor的相关文章

Visitor模式

访问者模式的目的是要把处理从数据结构中分离出来,如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是个不错的选择,因为访问者模式使的算法操作的增加变得容易.相反,如果系统的数据结构不稳定,易于变化,则此系统就不适合使用访问者模式了. 访问者模式结构:访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口. 具体访问者角色(Concrete Visitor): 实现每个由访问者角色(Visitor)声明的操作.元素角色(Element): 定义一个Acce

访问者模式(Visitor Pattern)

访问者模式:使用一个访问者类,改变元素的行为.通过这种方式,随着访问者的改变,被访问者的行为可以被改变. 类图: 实现Master接口的具体类是行为需要被改变的对象. 实现Visitor接口的具体类是访问者,访问者不同,实现Master接口的具体类的行为不同. public interface Master { public abstract String getName(); } public class ConcreteMaster implements Master { private S

设计模式:visitor

拜访者模式(visitor)适用于对复杂结构体进行解析的场景. 所谓复杂结构体,是指包含多个子元素的对象,比如集合,树,图,或者组合对象--.结构体中的每个元素,包括结构体本身实现接口: Element{ //element的信息属性,在此省略 //专门用于调用visitor的方法 void accept(visitor) } 所谓解析,是指提取结构体中各个元素的相关信息,组合起来.解析器实现接口: Visitor{ void accept(Element的具体子类);//因为不同的Elemen

JAVA设计模式之 访问者模式【Visitor Pattern】

一.概述 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作.在使用访问者模式时,被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为"对象结构",访问者通过遍历对象结构实现对其中存储的元素的逐个操作.访问者模式是一种对象行为型模式. 二.适用场景 当有多种类型的访问者(或是操作者) 对一组被访问者对象集合(或是对象结构)进行操作(其中对象集合也包含多种类型对象

访问者模式-Visitor

访问者模式:表示作用于某对象结构的个元素的操作.它使你在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式的适用场景:有比较稳定的数据结构,又有易于变化的算法的话,使用反复问这模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易. 访问者模式的优缺点: 优点:增加新的操作容易,因为增加新的操作就意味着增加一个新的访问者.访问者模式将有关的行为集中到一个访问者对象中. 缺点:访问者模式使得增加新的数据结构变得苦难了. 访问者模式结构图: 代码实现: 1 package com

访问者模式(Visitor)

一.访问者模式介绍 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 也就是说:针对不同对象做一些不同的操作,则可以使用访问者模式. 一般也很少用到!! ? 二.应用场景 XML文档解析器设计 编译器设计 复杂集合对象的处理 Java23种设计模式学习笔记[目录总贴] 参考资料: 大话设计模式(带目录完整版).pdf HEAD_FIRST设计模式(中文版).pdf 尚学堂_高淇_java300集最全视频教程_

【设计模式】—— 访问者模式Visitor

对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同.此时,就是访问者模式的典型应用了. 应用场景 1 不同的子类,依赖于不同的其他对象 2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法 3 定义的类很少改变,但是执行的操作却经常发生改变. 回到顶部 模式结构 Context 环境角色 class Context{ List<Node> list = new ArrayList(); public void add(Node node) { list.ad

设计模式入门之访问者模式Visitor

Set集合的配置 数据表的创建:表关系一个员工拥有多个身份 create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); create table CERTIFICATE ( id INT NOT NULL aut

设计模式入门之訪问者模式Visitor

//訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作.它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看,这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一些额外的职责).可是装饰模式很多其它是在原有的基础上进行功能加强或者改动:而訪问者模式很多其它是为对象加入全新的功能.訪问者模式适合那些须要频繁为某些类加入新功能.新操作的项目. //模式结构: //Visitor:訪问者接口,为全部的訪问者对象声明一个visit方法,用来表示对对象结构加入的功能,

【转载】完成C++不能做到的事 - Visitor模式

原文: 完成C++不能做到的事 - Visitor模式 拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据他们提出的意见适当修改代码并提交,一周的任务就完成了.剩下的两三天里,我就可以有一些空余的时间看看其它资料来继续充实自己了. 打开Review Board,可以看到我的代码已经被标记为可以提交,但是下面所留的注解引起了我的注意: “Great job! With this solution, we