访问者模式,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的心操作。【DP】
// Visitor.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <list>
using namespace std;
class ConcreteElementA;
class ConcreteElementB;
class Visitor
{
public:
virtual void VisitConcreteElementA(ConcreteElementA *concreteElementA) = 0;
virtual void VisitConcreteElementB(ConcreteElementB *concreteElementB) = 0;
};
class Element
{
public:
virtual void Accept(Visitor *visitor) = 0;
};
class ConcreteElementA : public Element
{
public:
void Accept(Visitor *visitor)
{
visitor->VisitConcreteElementA(this);
}
void OperationA()
{
}
};
class ConcreteElementB : public Element
{
public:
void Accept(Visitor *visitor)
{
visitor->VisitConcreteElementB(this);
}
void OperationB()
{
}
};
class ConcreteVisitor1 : public Visitor
{
public:
void VisitConcreteElementA(ConcreteElementA *concreteElementA)
{
cout << "concreteElementA 被 ConcreteVisitor1 访问" << endl ;
}
void VisitConcreteElementB(ConcreteElementB *concreteElementB)
{
cout << "concreteElementB 被 ConcreteVisitor1 访问" << endl ;
}
};
class ConcreteVisitor2 : public Visitor
{
public:
void VisitConcreteElementA(ConcreteElementA *concreteElementA)
{
cout << "concreteElementA 被 ConcreteVisitor2 访问" << endl ;
}
void VisitConcreteElementB(ConcreteElementB *concreteElementB)
{
cout << "concreteElementB 被 ConcreteVisitor2 访问" << endl ;
}
};
class ObjectStructure
{
private:
list<Element*> elements;
public:
void Attach(Element *element)
{
elements.push_back(element);
}
void Detach(Element *element)
{
elements.remove(element);
}
void Accept(Visitor *visitor)
{
auto it = elements.begin();
for (; it != elements.end(); ++it)
{
(*it)->Accept(visitor);
}
}
};
int _tmain(int argc, _TCHAR* argv[])
{
ObjectStructure *o = new ObjectStructure();
o->Attach(new ConcreteElementA());
o->Attach(new ConcreteElementB());
ConcreteVisitor1 *v1 = new ConcreteVisitor1();
ConcreteVisitor2 *v2 = new ConcreteVisitor2();
o->Accept(v1);
o->Accept(v2);
return 0;
}
访问者模式,使用于数据结构相对稳定的系统。
它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
访问者模式的目的是要把处理从数据结构分离出来。
如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
访问者的缺点就是增加了新的数据结构变得困难了。