美文网首页
设计模式-行为模式-访问者模式

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

作者: 阿棍儿_Leon | 来源:发表于2020-04-30 15:41 被阅读0次

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

    以下代码定义了访问者抽象类。被访问的对象有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()
    

    相关文章

      网友评论

          本文标题:设计模式-行为模式-访问者模式

          本文链接:https://www.haomeiwen.com/subject/lrnzwhtx.html