设计模式-行为模式-访问者模式

访问者模式用于访问对象的属性对象。可以在不改变属性对象类的前提下改变对属性对象的操作。

以下代码定义了访问者抽象类。被访问的对象有2个属性对象,分别为A和B。

#include 

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__<VisitB(this);
    }
    void Display()
    {
        cout<<__PRETTY_FUNCTION__<

以下代码定义了我们所要访问的对象,它的属性有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()

你可能感兴趣的:(设计模式-行为模式-访问者模式)