时间:2021-05-02
访问者模式(visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。反之,如果这样的系统的数据结构对象易于变化,经常要有新的数据对象增加进来,就不适合使用访问者模式。
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。通常concreteVisitor可以单独开发,不必跟concreteElement写在一起。访问者的缺点其实也就是使增加新的数据结构变得困难了。
结构图:
访问者模式基本示例代码
访问者模式 visitor.h、concreteVisitor.h、element.h、concreteElement.h、objectStructure.h
客户端 visitorApp.cpp
访问者模式
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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_concreteVisitor.h
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 /************************************************************************ * 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_element.h
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /************************************************************************ * 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_concreteElement.h
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #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_objectStructure.h
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 /************************************************************************ * 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_客户端
visitorApp.cpp
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 // 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; }使用访问者模式的优点和缺点
访问者模式有如下的优点:
访问者模式有如下的缺点:
访问者模式的适用场景:
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言这是23+1(简单工厂模式)之中的最后一个了——访问者模式。访问者模式也是一个比较麻烦的设计模式。我也没有实战经验,对于访问者模式的理解完全来自GOF的《设
本文实例讲述了javascript设计模式–访问者模式原理与用法。分享给大家供大家参考,具体如下:介绍:访问者模式比较复杂,它包含访问者和被访问元素两个主要组成
C++基础教程之指针拷贝详解指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此。特别是在C++中,如果不注意处理类中的指针,非常容易出问题。
C++单例模式的详解及实例1.什么叫单例模式?单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全
MySQL设计和命令行模式下建立详解系列文章:MySQL设计和命令行模式下建立详解C++利用MySQLAPI连接和操作数据库实例详解1.数据表的设计MySQL数