快速业务通道

设计模式的解析和实现(C++)之二十-Visitor模式

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-07-04

作用:

表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.

UML结构图:

解析:

Visitor模式把对结点的访问封装成一个抽象基类,通过派生出不同的类生成新的访问方式.在实现的时候,在visitor抽象基类中声明了对所有不同结点进行访问的接口函数,如图中的VisitConcreateElementA函数等,这样也造成了Visitor模式的一个缺陷--新加入一个结点的时候都要添加Visitor中的对其进行访问接口函数,这样使得所有的Visitor及其派生类都要重新编译了,也就是说Visitor模式一个缺点就是添加新的结点十分困难.另外,还需要指出的是Visitor模式采用了所谓的"双重分派"的技术,拿上图来作为例子,要对某一个结点进行访问,首先需要产生一个Element的派生类对象,其次要传入一个Visitor类派生类对象来调用对应的Accept函数,也就是说,到底对哪种Element采用哪种Visitor访问,需要两次动态绑定才可以确定下来,具体的实现可以参考下面实现代码中的Main.cpp部分是如何调用这些类的.

实现:

1)Visitor.h

/**//********************************************************************
    created:    2006/08/09
    filename:     Visitor.h
    author:        李创
                http://www.cppblog.com/converse/

    purpose:    Visitor模式的演示代码
*********************************************************************/

#ifndef VISITOR_H
#define VISITOR_H

class Visitor;

class Element
{
public:
    virtual ~Element(){}

    virtual void Accept(Visitor &rVisitor) = 0;

protected:
    Element(){}
};

class ConcreateElementA
    : public Element
{
public:
    virtual ~ConcreateElementA() {}

    virtual void Accept(Visitor &rVisitor);
};

class ConcreateElementB
    : public Element
{
public:
    virtual ~ConcreateElementB() {}

    virtual void Accept(Visitor &rVisitor);
};

class Visitor
{
public:
    virtual ~Visitor(){}

    virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA) = 0;
    virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB) = 0;

protected:
    Visitor(){}
};

class ConcreateVisitorA
    : public Visitor
{
public:
    virtual ~ConcreateVisitorA(){}

    virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA);
    virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB);
};

class ConcreateVisitorB
    : public Visitor
{
public:
    virtual ~ConcreateVisitorB(){}

    virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA);
    virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB);
};

#endif

2)Visitor.cpp

/**//********************************************************************
    created:    2006/08/09
    filename:     Visitor.cpp
    author:        李创
                http://www.cppblog.com/converse/

    purpose:    Visitor模式的演示代码
*********************************************************************/

#include "Visitor.h"
#include <iostream>

void ConcreateElementA::Accept(Vis

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号