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

UML结构图:

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

代码实现:

Visitor.h

 1 
 2 #ifndef VISITOR_H
 3 #define VISITOR_H
 4 
 5 class Visitor;
 6 
 7 class Element
 8 {
 9 public:
10     virtual ~Element(){}
11 
12     virtual void Accept(Visitor &rVisitor) = 0;
13 
14 protected:
15     Element(){}
16 };
17 
18 class ConcreateElementA
19     : public Element
20 {
21 public:
22     virtual ~ConcreateElementA() {}
23 
24     virtual void Accept(Visitor &rVisitor);
25 };
26 
27 class ConcreateElementB
28     : public Element
29 {
30 public:
31     virtual ~ConcreateElementB() {}
32 
33     virtual void Accept(Visitor &rVisitor);
34 };
35 
36 class Visitor
37 {
38 public:
39     virtual ~Visitor(){}
40 
41     virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA) = 0;
42     virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB) = 0;
43 
44 protected:
45     Visitor(){}
46 };
47 
48 class ConcreateVisitorA
49     : public Visitor
50 {
51 public:
52     virtual ~ConcreateVisitorA(){}
53 
54     virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA);
55     virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB);
56 };
57 
58 class ConcreateVisitorB
59     : public Visitor
60 {
61 public:
62     virtual ~ConcreateVisitorB(){}
63 
64     virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA);
65     virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB);
66 };
67 
68 #endif
69  

Visitor.cpp

 1 
 2 #include "Visitor.h"
 3 #include <iostream>
 4 
 5 void ConcreateElementA::Accept(Visitor &rVisitor)
 6 {
 7     rVisitor.VisitConcreateElementA(this);
 8 }
 9 
10 void ConcreateElementB::Accept(Visitor &rVisitor)
11 {
12     rVisitor.VisitConcreateElementB(this);
13 }
14 
15 void ConcreateVisitorA::VisitConcreateElementA(ConcreateElementA *pConcreateElementA)
16 {
17     std::cout << "VisitConcreateElementA By ConcreateVisitorA\n";
18 }
19 
20 void ConcreateVisitorA::VisitConcreateElementB(ConcreateElementB *pConcreateElementA)
21 {
22     std::cout << "VisitConcreateElementB By ConcreateVisitorA\n";
23 }
24 
25 void ConcreateVisitorB::VisitConcreateElementA(ConcreateElementA *pConcreateElementA)
26 {
27     std::cout << "VisitConcreateElementA By ConcreateVisitorB\n";
28 }
29 
30 void ConcreateVisitorB::VisitConcreateElementB(ConcreateElementB *pConcreateElementA)
31 {
32     std::cout << "VisitConcreateElementB By ConcreateVisitorB\n";
33 }
34 

Main.cpp

 1 
 2 #include "Visitor.h"
 3 
 4 int main()
 5 {
 6     Visitor *pVisitorA = new ConcreateVisitorA();
 7     Element *pElement  = new ConcreateElementA();
 8 
 9     pElement->Accept(*pVisitorA);
10 
11     delete pElement;
12     delete pVisitorA;
13 
14     return 0;
15 }
16 

转载于:https://www.cnblogs.com/whiteyun/archive/2010/12/05/1896928.html

设计模式 - Visitor 模式(访问者模式)相关推荐

  1. 设计模式学习之访问者模式

    访问者模式,是行为型设计模式之一.访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是 ...

  2. 【Java设计模式】:行为型模式—访问者模式

    1. 访问者模式简介 访问者模式,是行为型设计模式之一.访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需 ...

  3. Visitor(访问者模式)

    名  称  Visitor(访问者模式) 意  图  表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 适  用 环  境  u       ...

  4. visitor java_访问者模式(Visitor)_java实现

    // 20210202 写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现访问者模式 访问者模式核心思想 网上找的帖子都说访问者模式是最复杂的一个模式, ...

  5. 设计模式学习之访问者模式(Visitor,行为型模式)(21)

    参考:https://www.cnblogs.com/edisonchou/p/7247990.html 在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根 ...

  6. 《研磨设计模式》chap25 访问者模式Visitor(3)联合组合模式+总结

    1. 联合组合模式 //抽象的组件对象,相当于访问者模式中的元素对象 public abstract class Component {//接受访问者的访问 public abstract void ...

  7. 《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景

    1. 实现 //各种客户的父类 public abstract class Customer { private String customerId;// 客户编号 private String na ...

  8. 《研磨设计模式》chap25 访问者模式Visitor(1)模式介绍

    场景:给用户做服务,分为个人用户.企业用户,服务不断地变. 1. 正常编码(不使用模式) public abstract class Customer {private String customer ...

  9. Net设计模式实例之访问者模式(Visitor Pattern)

    一.访问者模式简介(Brief Introduction) 表示一个作用于某对象结构中的元素操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦 ...

  10. C#设计模式系列:访问者模式(Visitor)

    1.访问者模式简介 1.1>.定义 作用于某个对象群中各个对象的操作,可以使在不改变对象本身的情况下,定义作用于对象的新操作. 1.2>.使用频率   低 2.访问者模式结构 2.1> ...

最新文章

  1. 高可用软件heartbeat服务章节目录(草稿)
  2. 免费网络推广浅析对网站首页优化的注意细节把控!
  3. 比亚迪秦wince玩游戏_【新闻】1.5T比亚迪秦Pro或要降价/多款亲民新车上市!
  4. redux-form(V7.4.2)笔记(二)
  5. statistic在c语言中的作用,模型评价除了C-statistic,还能用什么指标?
  6. postgresql分割字符串_postgresql 实现字符串分割字段转列表查询
  7. day4--numpy
  8. mongodb查询分页优化(二)
  9. win10中的depends walker不兼容问题
  10. 汇编语言跳转指令总结
  11. 微处理器 微型计算机 单片机之间有何区别,微处理器、微计算机、微处理机、CPU、单片机、嵌入式处理器它们之间有什么区别?...
  12. ARM、单片机、stm32、51单片机、和开发板的概念、区别及包含关系
  13. 新加坡国立大学计算机学院师资,我系教师刘志刚赴新加坡国立大学访学
  14. 数据库cosc2406-2407辅导week10-quiz-Transactions and Concurrency
  15. 以某SCI期刊为例说明该期刊投稿须知和流程
  16. 这几年被分布式坑惨了,曝光十大坑
  17. Css Reset -Css样式重置
  18. python画公主_【图片】来几张公主的手绘【勇敢的公主吧】_百度贴吧
  19. 【转】什么是预研?产品预研与技术预研
  20. Project Treble是Android升级的最终方案吗?

热门文章

  1. Nexus1000v部署
  2. 分布式监控系统Zabbix-3.0.3-完整安装记录(4)-解决zabbix监控图中出现中文乱码问题...
  3. win10个人壁纸默认保存位置
  4. An unknown error occurred.
  5. IE与firefox区别
  6. solaris10上修改最大文件句柄数
  7. 深圳行:1207-Day 1 - 到达
  8. log4j 不同功能,同INFO级别,输出到不同log文件
  9. Linux下MySQL基础使用命令
  10. c#委托把方法当成参数