访问者模式
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
本文讲解访问者模式框架,代码使用C++语言描述,代码存在的不足或问题有望各位指出。
访问者模式代码框架
//访问者模式
#include <iostream>
using namespace std;
class ConcreteElementA;
class ConcreteElementB;
class Element;
class Visitor
{
public:
virtual ~Visitor(){}
virtual void VisitConcreteElementA(Element* elm) = 0;
virtual void VisitConcreteElementB(Element* elm) = 0;
protected:
Visitor(){}
private:
};
class ConcreteVisitorA:public Visitor{
public:
ConcreteVisitorA(){}
virtual ~ConcreteVisitorA(){}
void VisitConcreteElementA(Element* elm) override
{
cout<<"i will visit ConcreteElementA..."<<endl;
}
void VisitConcreteElementB(Element* elm) override
{
cout<<"i will visit ConcreteElementB..."<<endl;
}
protected:
private:
};
class ConcreteVisitorB:public Visitor {
public:
ConcreteVisitorB(){}
virtual ~ConcreteVisitorB(){}
void VisitConcreteElementA(Element* elm) override
{
cout<<"i will visit ConcreteElementA..."<<endl;
}
void VisitConcreteElementB(Element* elm) override
{
cout<<"i will visit ConcreteElementB..."<<endl;
}
protected:
private:
};
class Element
{
public:
virtual ~Element(){}
virtual void Accept(Visitor* vis) = 0;
protected:
Element(){}
private:
};
class ConcreteElementA:public Element
{
public:
ConcreteElementA(){}
~ConcreteElementA(){}
void Accept(Visitor* vis) override
{
vis->VisitConcreteElementA(this);
cout<<"visiting ConcreteElementA..."<<endl;
}
protected:
private:
};
class ConcreteElementB:public Element {
public:
ConcreteElementB(){}
~ConcreteElementB(){}
void Accept(Visitor* vis) override
{
cout<<"visiting ConcreteElementB..."<<endl;
vis->VisitConcreteElementB(this);
}
protected:
private:
};
int main()
{
Visitor* vis = new ConcreteVisitorA();
Element* elm = new ConcreteElementA();
elm->Accept(vis);
delete vis;
delete elm;
return 0;
}
设计模式的应用
1、访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
2、访问者模式的目的是要处理从数据结构分离出来,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
3、访问者的缺点其实也就是使增加新的数据结构变得困难了。