C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++访问者模式

C++实现访问者模式的基础介绍

作者:herryone123

访问者模式表示一个作用于某对象结构中各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。对C++访问者模式相关知识感兴趣的朋友一起看看吧

一、访问者模式基础知识

1.1 模式动机

       对于系统中的某些对象中可能存在多种不同类型的元素,而且不同的调用者使用这些元素时也有所区别,这些调用者称为访问者。

        访问者模式(Visitor Pattern):表示一个作用于某对象结构中各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

访问者模式的应用场景:

1.2 访问者模式结构

 访问者模式中对象结构存储了不同类型的元素对象,以提供不同访问者访问。访问者模式包括两个层次结构,一个是访问者层次结构,提供了抽象访问者和具体访问者,一个是元素层次结构,提供了抽象元素和具体元素。

相同的访问者可以以不同的方式访问不同的元素,相同的元素可以接受不同访问者以不同的方式访问。

(1)Visitor (抽象访问者)

抽象访问者为对象结构类中每一个具体元素类声明一个访问操作。

(2)ConcreteVisitor (具体访问者)

具体访问者实现了每个由抽象访问者声明的操作,每一个操作用于访问对象结构中一种元素类型的元素。

(3)Element(抽象元素)

抽象元素一般是抽象类或接口,定义一个accept()方法,该方法以一个抽象访问者作为参数。

(4)ConcreteElement (具体元素)

具体访问者实现了accept()方法,在其accept()

(5)ObjectStructure(对象结构)

对象结构是一个元素的集合,它用于存放元素对象,并且提供了遍历其内部元素的方法。

1.3 访问者模式优缺点

访问者模式优点:

模式的缺点:

1.4 访问者模式应用

#include <iostream>
 
#include <vector>
 
using namespace std;
 
class ConcreteElementA;
class ConcreteElementB;
 
/*抽象访问者  声明了访问元素对象的方法,通常为每一种类型的元素对象都提供一个访问方法*/
class Visitor
 
{
 
public:
 
     virtual void VisitConcreteElementA(ConcreteElementA *pElementA) = 0;
     virtual void VisitConcreteElementB(ConcreteElementB *pElementB) = 0;
 
};
 
/*具体访问者 用于定义对不同类型元素对象的操作*/
class ConcreteVisitor1 : public Visitor
 
{
public:
     void VisitConcreteElementA(ConcreteElementA *pElementA){
        // 现在根据传进来的pElementA,可以对ConcreteElementA中的element进行操作
    }
 
     void VisitConcreteElementB(ConcreteElementB *pElementB){
         // 现在根据传进来的pElementB,可以对ConcreteElementB中的element进行操作
    }
 
};
 
/*具体访问者2*/
class ConcreteVisitor2 : public Visitor
{
 
public:
     void VisitConcreteElementA(ConcreteElementA *pElementA){
    }
     void VisitConcreteElementB(ConcreteElementB *pElementB){
    }
};
 
 
/*抽象元素类 声明accept()方法,用于接受访问者的访问*/
class Element
 
{
public:
     virtual void Accept(Visitor *pVisitor) = 0;//accept用于接受访问者的访问
};
 
/*具体元素类 通过调用Visitor类的visit()方法实现对元素的访问*/
class ConcreteElementA : public Element
{
public:
     void Accept(Visitor *pVisitor)//通过调用visitor对象的 visit()方法实现对元素对象的访问
    {
        pVisitor->VisitConcreteElementA(this);
    }
};
 
/*具体元素类 */
class ConcreteElementB : public Element
{
public:
     void Accept(Visitor *pVisitor)
    {
     pVisitor->VisitConcreteElementB(this);
    }
};
 
// ObjectStructure类(对象结构类),能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素
class ObjectStructure
{
public:
     void Attach(Element *pElement){
         elements.push_back(pElement);
    }
 
     void Detach(Element *pElement)   
    {
 
         vector<Element *>::iterator it = find(elements.begin(), elements.end(), pElement);
         if (it != elements.end())
         {
              elements.erase(it);
         }
    }
 
     void Accept(Visitor *pVisitor){
     // 为每一个element设置visitor,进行对应的操作
         for (vector<Element *>::const_iterator it = elements.begin(); it != elements.end(); ++it)
         {
              (*it)->Accept(pVisitor);
         }
 
}
 
int main()
{
     //实例化对象结构,用于存放元素对象,提供遍历其内部元素的方法
     ObjectStructure *pObject = new ObjectStructure;
      //实例化具体元素 并将创建好的元素放入对象结构中
     ConcreteElementA *pElementA = new ConcreteElementA;
     ConcreteElementB *pElementB = new ConcreteElementB;
     pObject->Attach(pElementA);
     pObject->Attach(pElementB);
     //实例化访问者                                                                                                                      
     ConcreteVisitor1 *pVisitor1 = new ConcreteVisitor1;
     ConcreteVisitor2 *pVisitor2 = new ConcreteVisitor2;
     //调用accept方法 来接受访问者对象的访问
     pObject->Accept(pVisitor1);
     pObject->Accept(pVisitor2);
 
     if (pVisitor2) delete pVisitor2;
     if (pVisitor1) delete pVisitor1;
     if (pElementB) delete pElementB;
     if (pElementA) delete pElementA;
     if (pObject) delete pObject;
 
     return 0;
}

参考文献:

【1】访问者模式(c++实现):访问者模式(c++实现)

【2】C++设计模式之访问者模式: https://www.jb51.net/article/55999.htm

到此这篇关于C++实现访问者模式的文章就介绍到这了,更多相关C++访问者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文