设计模式之二十四:访问者模式(Visitor)

访问者模式:

定义了一个作用于一个类的一些操作,访问者模式允许在不改变类的前提下增加一些操作。

Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

UML类图:

主要包括:

  1. Visitor:声明了一个所有访问器都需要实现的接口。
  2. ConcreteVisitor:实现每个访问器都需要实现的接口,每个操作知识实现了和特定类相关的一些算法。
  3. Element:定义了一个需要接受Visitor作为参数的accept方法。
  4. ConcreteElement:实现了accept方法的类。
  5. ObjectStructure:包含所有的Element对象,提供了一个高层次的接口允许visitor访问elements元素。

    这个模式主要使用在需要给类添加一个功能,但是不希望在类中添加时使用。

    C++代码实现:

#include <iostream>
#include <list>

using namespace std;

class ConcreteElementA;
class ConcreteElementB;

class Visitor
{
        public:
                virtual void visitConcreteElementA(ConcreteElementA * c)=0;
                virtual void visitConcreteElementB(ConcreteElementB *)=0;
};

class ConcreteVisitor1:public Visitor
{
        public:
                virtual void visitConcreteElementA(ConcreteElementA * c)
                {
                    cout<<"ConcreteVisit1 operate on ConcreteElementA"<<endl;
                }

                virtual void visitConcreteElementB(ConcreteElementB *)
                {
                    cout<<"ConcreteVisitor1 operate on ConcreteElementB"<<endl;
                }
};

class ConcreteVisitor2:public Visitor
{
        public:
                virtual void visitConcreteElementA(ConcreteElementA * c)
                {
                    cout<<"ConcreteVisit2 operate on ConcreteElementA"<<endl;
                }

                virtual void visitConcreteElementB(ConcreteElementB *)
                {
                    cout<<"ConcreteVisitor2 operate on ConcreteElementB"<<endl;
                }
};

class Element
{
        public:
                virtual void accept(Visitor * visitor)=0;

};

class ConcreteElementA:public Element
{
        public:
                 void accept(Visitor * visitor)
                {
                    visitor->visitConcreteElementA(this);
                }

};

class ConcreteElementB:public Element
{
        public:
                 void accept(Visitor * visitor)
                {
                    visitor->visitConcreteElementB(this);
                }

};

class ObjectStructure
{
        public:
                void attach(Element *e)
                {
                    elements.push_back(e);
                }
                void detach(Element *e)
                {
                    elements.remove(e);
                }
                void accept(Visitor * v)
                {
                    list<Element *>::iterator iter;
                    for(iter=elements.begin();iter!=elements.end();iter++)
                    {
                        (*iter)->accept(v);
                    }
                }

        private:
                list<Element *> elements;

};

int main()
{
    ObjectStructure * o=new ObjectStructure();
    Element * a=new ConcreteElementA();
    Element * b=new ConcreteElementB();
    o->attach(a);
    o->attach(b);

    Visitor * v1=new ConcreteVisitor1();
    Visitor *v2=new ConcreteVisitor2();
    o->accept(v1);
    o->accept(v2);

    delete o;
    delete a;
    delete b;
    delete v1;
    delete v2;

}

执行输出:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-15 06:13:32

设计模式之二十四:访问者模式(Visitor)的相关文章

云计算设计模式(二十四)——仆人键模式

云计算设计模式(二十四)——仆人键模式 使用一个令牌或密钥,向客户提供受限制的直接访问特定的资源或服务,以便由应用程序代码卸载数据传输操作.这个模式是在使用云托管的存储系统或队列的应用中特别有用,并且可以最大限度地降低成本,最大限度地提高可扩展性和性能. 背景和问题 客户端程序和网络浏览器经常需要读取和写入文件或数据流,并从一个应用程序的存储空间.通常,应用程序将处理的运动数据,或者通过从存储读取它,并将其传输到客户端,或通过从客户机读取该载流并将其存储在数据存储中.然而,这种方法吸收了宝贵的资

设计模式之二十四:訪问者模式(Visitor)

訪问者模式: 定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作. Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. UML类图: 主要包括: Vis

设计模式(二十四)---状态模式

1.简介 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 状态模式允许一个对象在其内部状态改变时改变其行为,这个对象看上去就像改变了他的类一样 2.状态模式类图 3.状态模式涉及到的角色 从上图可以看出  状态模式涉及到以下几个角色 3.1.抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为 3.2.具体状态(ConcreteState)角色:每一个具体状态类都实现了环境的一个状态所对应的行为 3.3.

Java设计模式菜鸟系列(十四)代理模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435 代理模式(Composite):代理模式其实就是多一个代理类出来,替原对象进行一些操作.比如咱有的时候打官司需要请律师,因为律师在法律方面有专长,可以替咱进行操作表达咱的想法,这就是代理的意思.代理模式分为两类:1.静态代理(不使用jdk里面的方法):2.动态代理(使用jdk里面的InvocationHandler和Proxy).下面请看示例: 一.静态代理 1.uml建模

设计模式(二十)解释器模式(Interpreter)-行为型

解释器模式Interpreter 解释器模式在软件开发中应用的比较少,它主要用在底层的编程语言设计上,因此不太容易理解. 联想:传一个算数表达式,对加减乘除自动匹配,能够自动计算其结果. 原理图 解释器模式实现原理图 单个运算符的数学公式计算机可以用来理解这个解释器模式的使用. 参考文献 [1] 郭峰.深入浅出设计莫模式[M].中国铁道出版社,2013(1):415-423.

访问者模式 Visitor 行为型 设计模式(二十七)

访问者模式 Visitor <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白: “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年必到中原武林,向各大门派下发放赏善罚恶令, 强邀掌门人赴岛喝腊八粥,拒接令者,皆造屠戮,无一幸免,接令而去者,杳无音讯,生死未仆,侠客岛之行,已被视为死亡之旅.” 不过话说电视剧,我总是觉得老版的好看. 意图 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.

设计模式入门之访问者模式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

云计算设计模式(二十)——调度程序代理管理者模式

云计算设计模式(二十)——调度程序代理管理者模式 协调一系列在分布式服务集和其他远程资源的的行为,试图透明地处理故障,如果这些操作失败,或撤销,如果系统不能从故障中恢复执行工作的影响.这种模式可以分布式系统中增加弹性和灵活性,使之恢复和重试失败是由于短暂的异常,持久的故障和处理故障等操作. 背景和问题 应用程序执行其包括多个步骤,其中的一些可以调用远程服务或访问远程资源的任务.各个步骤可以是相互独立的,但它们是由实现该任务的应用程序逻辑编排. 只要有可能,应用程序应该确保任务运行完成和解决远程访

24、蛤蟆的数据结构笔记之二十四串的模式匹配算法

24.蛤蟆的数据结构笔记之二十四串的模式匹配算法 本篇名言:"燧石受到的敲打越厉害,发出的光就越灿烂. -- 马克思" 来看下两个算法,BF和KMP算法在串的模式匹配中实现. 欢迎转载,转载请标明出处: 1.  BF算法 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果.B