訪問者模式,表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的心操作。【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;
}
訪問者模式,使用於數據結構相對穩定的系統。
它把數據結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。
訪問者模式的目的是要把處理從數據結構分離出來。
如果系統有比較穩定的數據結構,又有易於變化的算法的話,使用訪問者模式就是比較合適的,因爲訪問者模式使得算法操作的增加變得容易。
訪問者模式的優點就是增加新的操作很容易,因爲增加新的操作就意味着增加一個新的訪問者。訪問者模式將有關的行爲集中到一個訪問者對象中。
訪問者的缺點就是增加了新的數據結構變得困難了。