意图:
表示一个作用于某对象结构中的各元素的操作。可以在不改变元素的类的前提下定义作用于这些元素的新操作
适用性:
1一个对象结构包含很多类对象,它们有不同的接口,需要对这些对象实施一些依赖于具体类的操作
2需要对一个对象结构中的对象进行很不同的并且不相关的操作,Visitor使得相关的操作集中定义在一个类中
3定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。
效果:
1访问者模式使得易于增加新的操作
2访问者集中相关的操作而分离无关的操作
3增加新的ConcreteElement很困难,每增加一个新的ConcreteElement都要在Visitor中增加新的抽象操作,并在每一个ConcreteVisitor类中实现相应操作
4破坏封装
The sample code is as below:
Visitor.h
- class EquipmentVisitor;
- class Equipment
- {
- public:
- virtual ~Equipment();
- const char* Name() {return _name;}
- virtual void Accpet(EquipmentVisitor&) = 0;
- protected:
- Equipment(const char *);
- private:
- const char* _name;
- };
- class FloppyDisk;
- class EquipmentVisitor
- {
- public:
- virtual ~EquipmentVisitor();
- virtual void VisitFloppyDisk(FloppyDisk*);
- EquipmentVisitor();
- };
- class FloppyDisk:public Equipment
- {
- public:
- FloppyDisk(const char *);
- virtual ~FloppyDisk();
- virtual void Accpet(EquipmentVisitor&);
- };
Visitor.cpp
- #include "Visitor.h"
- #include <iostream>
- using namespace std;
- Equipment::Equipment(const char* s):_name(s)
- {
- cout<<"An Equipment with the name "<<_name<<" is created."<<endl;
- }
- Equipment::~Equipment()
- {
- cout<<"An Equipment with the name "<<_name<<" is destroyed."<<endl;
- // delete _name;
- }
- FloppyDisk::FloppyDisk(const char* s): Equipment(s)
- {
- cout<<"A floppy is created"<<endl;
- }
- FloppyDisk::~FloppyDisk()
- {
- cout<<"A floppy is destoryed"<<endl;
- }
- EquipmentVisitor::EquipmentVisitor()
- {
- cout<<"An equipmentVisitor is created"<<endl;
- }
- EquipmentVisitor::~EquipmentVisitor()
- {
- cout<<"An equipmentVisitor is destroyed"<<endl;
- }
- void EquipmentVisitor::VisitFloppyDisk(FloppyDisk* f)
- {
- cout<<"Visit Floppy Disk"<<endl;
- }
- void FloppyDisk::Accpet(EquipmentVisitor& visitor)
- {
- visitor.VisitFloppyDisk(this);
- }
main.cpp
- #include "Visitor.h"
- #include <iostream>
- using namespace std;
- int main()
- {
- FloppyDisk* floppydisk=new FloppyDisk("123");
- EquipmentVisitor visitor;
- floppydisk->Accpet(visitor);
- return 0;
- }