• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 详解C++设计模式编程中对访问者模式的运用

详解C++设计模式编程中对访问者模式的运用

作者:freshow 字体:[增加 减小] 来源:互联网 时间:2017-05-28

freshow 通过本文主要向大家介绍了设计模式c++,c++设计模式pdf,大话设计模式c++,c++ qt设计模式,c++设计模式视频教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

访问者模式(visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。反之,如果这样的系统的数据结构对象易于变化,经常要有新的数据对象增加进来,就不适合使用访问者模式。

访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。通常concreteVisitor可以单独开发,不必跟concreteElement写在一起。访问者的缺点其实也就是使增加新的数据结构变得困难了。

结构图:

2016316111637382.jpg (734×565)

访问者模式基本示例代码

访问者模式 visitor.h、concreteVisitor.h、element.h、concreteElement.h、objectStructure.h

客户端 visitorApp.cpp

访问者模式

visitor.h
/************************************************************************ 
 * description: 为该对象结构中ConcreteElement的每一个类声明一个visit操作 
 * remark:  
************************************************************************/ 
#ifndef _VISITOR_H_ 
#define _VISITOR_H_ 
class concreteElementA; 
class concreteElementB; 
class visitor 
{ 
public: 
 visitor(){}; 
 virtual ~visitor(){}; 
 virtual void visitConcreteElementA(concreteElementA* pConcreteElementA) = 0; 
 virtual void visitConcreteElementB(concreteElementB* pConcreteElementB) = 0; 
}; 
#endif// _VISITOR_H_ 
</div>

 

concreteVisitor.h

/************************************************************************ 
 * description: 具体访问者,实现每个由visitor声明的操作。每个操作实现算法 
    的一部分,而该算法片断乃是对应于结构中对象的类 
 * remark:  
************************************************************************/ 
#ifndef _CONCRETE_VISITOR_H_ 
#define _CONCRETE_VISITOR_H_ 
#include "visitor.h" 
#include <iostream> 
using namespace std; 
class concreteVisitor1 : public visitor 
{ 
public: 
 concreteVisitor1(){}; 
 ~concreteVisitor1(){}; 
 virtual void visitConcreteElementA(concreteElementA* pConcreteElementA) 
 { 
  cout << "concreteElementA被concreteVisitor1访问" << endl;  
 } 
 virtual void visitConcreteElementB(concreteElementB* pConcreteElementB) 
 { 
  cout << "concreteElementB被concreteVisitor1访问" << endl;   
 } 
}; 
 
class concreteVisitor2 : public visitor 
{ 
public: 
 concreteVisitor2(){}; 
 ~concreteVisitor2(){}; 
 virtual void visitConcreteElementA(concreteElementA* pConcreteElementA) 
 { 
  cout << "concreteElementA被concreteVisitor2访问" << endl;  
 } 
 virtual void visitConcreteElementB(concreteElementB* pConcreteElementB) 
 { 
  cout << "concreteElementB被concreteVisitor2访问" << endl;   
 } 
}; 
#endif// _CONCRETE_VISITOR_H_ 
</div>

element.h

/************************************************************************ 
 * description: 定义一个accept操作,它以一个访问者为参数 
 * remark:  
************************************************************************/ 
#ifndef _ELEMENT_H_ 
#define _ELEMENT_H_ 
class visitor; 
class element 
{ 
public: 
 element(){}; 
 virtual ~element(){}; 
 virtual void accept(visitor* pVisitor) = 0; 
}; 
#endif// _ELEMENT_H_ 
</div>

  

concreteElement.h

#ifndef _CONCRETE_ELEMENT_H_ 
#define _CONCRETE_ELEMENT_H_ 
#include "element.h" 
#include <iostream> 
using namespace std; 
class concreteElementA : public element 
{ 
public: 
 concreteElementA(){}; 
 ~concreteElementA(){}; 
 // 充分利用双分派技术,实现处理与数据结构的分离 
 virtual void accept(visitor* pVisitor) 
 { 
  if (NULL != pVisitor) 
  { 
   pVisitor->visitConcreteElementA(this); 
  } 
 } 
 // 其他的相关方法 
 void operationA() 
 { 
  cout << "具体元素A的其他相关方法" << endl; 
 } 
}; 
class concreteElementB : public element 
{ 
public: 
 concreteElementB(){}; 
 ~concreteElementB(){}; 
 // 充分利用双分派技术,实现处理与数据结构的分离 
 virtual void accept(visitor* pVisitor) 
 { 
  if (NULL != pVisitor) 
  { 
   pVisitor->visitConcreteElementB(this); 
  } 
 } 
 // 其他的相关方法 
 void operationB() 
 { 
  cout << "具体元素B的其他相关方法" << endl; 
 } 
}; 
#endif// _CONCRETE_ELEMENT_H_ 
</div>

 

objectStructure.h

/************************************************************************ 
 * description: 枚举元素,可以提供一个高层的接口以允许访问者访问它的元素 
 * remark:  
************************************************************************/ 
#ifndef _OBJECT_STRUCTURE_H_ 
#define _OBJECT_STRUCTURE_H_ 
#include "element.h" 
#include "visitor.h" 
#include <list> 
using namespace std; 
class objectStructure 
{ 
public: 
 void attach(element* pElement) 
 { 
  m_list.push_back(pElement); 
 } 
 void detach(element* pElement) 
 { 
  m_list.remove(pElement); 
 } 
 void accept(visitor* pVisitor) 
 { 
  list<element*>::iterator Iter; 
  for (Iter = m_list.begin(); Iter != m_list.end(); ++Iter) 
  { 
   if (NULL != *Iter) 
   { 
    (*Iter)->accept(pVisitor); 
   }    
  } 
 } 
private: 
 list<element*> m_list; 
}; 
#endif// _OBJECT_STRUCTURE_H_ 
</div>

客户端      

visitorApp.cpp

// visitorApp.cpp : 定义控制台应用程序的入口点。 
// 
#include "stdafx.h" 
#include "objectStructure.h" 
#include "concreteElement.h" 
#include "concreteVisitor.h" 
void freePtr(void* vptr) 
{ 
 if (NULL != vptr) 
 { 
  delete vptr; 
  vptr = NULL; 
 } 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
 objectStructure* pObject = new objectStructure(); 
 if (NULL != pObject) 
 { 
  element* pElementA = new concreteElementA(); 
  element* pElementB = new concreteElementB(); 
  pObject->attach(pElementA); 
  pObject->attach(pElementB); 
  concreteVisitor1* pVisitor1 = NULL; 
  pVisitor1 = new concreteVisitor1(); 
  concreteVisitor2* pVisitor2 = NULL; 
  pVisitor2 = new concreteVisitor2(); 
  pObject->accept(pVisitor1); 
  pObject->accept(pVisitor2); 
  system("pause"); 
  freePtr(pVisitor2); 
  freePtr(pVisitor1); 
  freePtr(pElementB); 
  freePtr(pElementA); 
  freePtr(pObject); 
 } 
 return 0; 
} 
</div>

使用访问者模式的优点和缺点

访问者模式有如下的优点:

  • 访问者模式使得增加新的操作变得很容易。如果一些操作依赖于一个复杂的结构对象的话,那么一般而言,增加新的操作会很复杂。而使用访问者模式,增加新的操作就意味着增加一个新的访问者类,因此,变得很容易。
  • 访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。
  • 访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。迭代子只能访问属于同一个类型等级结构的成员对象,而不能访问属于不同等级结构的对象。访问者模式可以做到这一点。
  • 积累状态。每一个单独的访问者对象都集中了相关的行为,从而也就可以在访问的过程中将执行操作的状态积累在自己内部,而不是分散到很多的节点对象中。这是有益于系统维护的优点。

访问者模式有如下的缺点:

  • 增加新的节点类变
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入理解C++之策略模式
  • C++设计模式编程中简单工厂与工厂方法模式的实例对比
  • 解析C++编程中如何使用设计模式中的状态模式结构
  • 详解C++设计模式编程中对访问者模式的运用
  • C++设计模式编程之Flyweight享元模式结构详解
  • 详解C++设计模式编程中责任链模式的应用
  • 深入剖析设计模式中的组合模式应用及在C++中的实现
  • 设计模式中的备忘录模式解析及相关C++实例应用
  • 深入解析设计模式中的适配器模式在C++中的运用
  • 全面解析设计模式中的建造者模式及相关C++实现

相关文章

  • 2017-05-28探讨C++中不能声明为虚函数的有哪些函数
  • 2017-05-28c++ #include是怎么样工作的?
  • 2017-05-28纯C语言:递归最大数源码分享
  • 2017-05-28C++生成dll和调用dll的方法实例
  • 2017-05-28C++输入输出操作符重载的深入分析
  • 2017-05-28C语言中快速排序和插入排序优化的实现
  • 2017-05-28用C实现PHP扩展 Image_Tool 图片常用处理工具类的使用
  • 2017-05-28C++基础入门教程(三):数组、字符串、结构体、共用体
  • 2017-05-28C++ COM编程之接口背后的虚函数表
  • 2017-05-28基于Turbo C(V2.0)编译错误信息的详细介绍

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入解析C++ STL中的常用容器
    • 解析四则表达式的编译过程及生成汇编代码
    • OLEDB打开Excel文件的实现方法
    • 求子数组最大和的解决方法详解
    • C++中virtual继承的深入理解
    • 深入理解链表的各类操作详解
    • C++如何调用matlab函数
    • C#复制和深度复制的实现方法
    • c++中inline的用法分析
    • C++中队列的建立与操作详细解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有