访问者模式用于访问对象的属性对象。可以在不改变属性对象类的前提下改变对属性对象的操作。
以下代码定义了访问者抽象类。被访问的对象有2个属性对象,分别为A和B。
#include <iostream>
using namespace std;
class Vistor
{
public:
virtual ~Vistor(){}
virtual void VisitA(class Element* e) = 0;
virtual void VisitB(class Element* e) = 0;
};
以下代码定义了元素抽象类。它有接受访问和自我展示(用于演示)的功能。
class Element
{
public:
virtual ~Element(){}
virtual void Accept(Vistor* visitor) = 0;
virtual void Display()=0;
};
以下代码定义了具体的访问者类。
class ConcreteVistor:public Vistor
{
public:
void VisitA(Element* e)
{
cout<<__PRETTY_FUNCTION__<<' ';
e->Display();
}
void VisitB(Element* e)
{
cout<<__PRETTY_FUNCTION__<<' ';
e->Display();
}
};
以下代码定义了元素A和B。
class ElementA:public Element
{
public:
void Accept(Vistor* visitor)
{
visitor->VisitA(this);
}
void Display()
{
cout<<__PRETTY_FUNCTION__<<endl;
}
};
class ElementB:public Element
{
public:
void Accept(Vistor* visitor)
{
visitor->VisitB(this);
}
void Display()
{
cout<<__PRETTY_FUNCTION__<<endl;
}
};
以下代码定义了我们所要访问的对象,它的属性有A和B两种元素的对象。
class ObjectStructure
{
private:
Element* eA;
Element* eB;
public:
ObjectStructure(Element* a, Element* b):eA(a), eB(b){}
void Accept(Vistor* visitor)
{
eA->Accept(visitor);
eB->Accept(visitor);
}
};
以下代码演示了访问者模式。首先创建访问者对象,然后创建A和B元素,并加到我们要访问的对象中,最后这个对象接受了访问者的访问。
int main(void){
Vistor* visitor = new ConcreteVistor();
Element* a = new ElementA();
Element* b = new ElementB();
ObjectStructure os(a, b);
os.Accept(visitor);
delete visitor;
delete a;
delete b;
return 0;
}
输出
virtual void ConcreteVistor::VisitA(Element*) virtual void ElementA::Display()
virtual void ConcreteVistor::VisitB(Element*) virtual void ElementB::Display()
网友评论