访问者模式(Visitor)

简介: 访问者模式(Visitor)

访问者模式(Visitor)

访问者模式是编者自学习设计模式以来最难的一个模式。

定义:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。


#include <iostream>
using namespace std;
class Visitor;
class library{
    public:
/*定义一个Accept操作它以访问者为一个参数*/
    virtual void Accept(Visitor *visitor)=0;
}; 
/*创建数据结构并且提供访问者的接口*/
class Book:public library{
    private:
        int page;
    public:
        Book(int page)
        {
            this->page=page;
        }
        int GetOfPage()
        {
            return page;
        }
        void Accept(Visitor *visitor);
};
class File:public library{
    private:
        int page;
    public:
        File(int page)
        {
            this->page=page;
        }
        int GetOfPage()
        {
            return page;
        }
        void Accept(Visitor *visitor);
};
class Visitor{
  protected:
    int sum;
    public:
        Visitor(){
            sum=0;
        }
        virtual void GetOfBookPage(Book *t)=0;
        virtual void GetOfFilePage(File *t)=0;
};
/*增加不同处理功能的访问者*/
class BookPage:public Visitor{
    public:
        void GetOfBookPage(Book *t)
        {
            sum+=t->GetOfPage();
            cout<<"Page="<<sum<<endl;
        }
        void GetOfFilePage(File *t)
          {
          }
};
class FilePage:public Visitor{
    public:
        void GetOfBookPage(Book *t)
        {
        }
        void GetOfFilePage(File *t)
        {
            sum+=t->GetOfPage();
            cout<<"Page="<<sum<<endl;
        }
};
/*当这个函数被调用的时候Book对象必然已经创建并且具有自己的信息*/
void Book::Accept(Visitor *visitor)
{
/*将自己的信息传给访问者,那么当访问者得到以后就可以实现操作*/
    visitor->GetOfBookPage(this);
}
void File::Accept(Visitor *visitor)
{
    visitor->GetOfFilePage(this);
}
int main(void)
{
    Book *book=new Book(168);
    File *file=new File(132);
    Visitor *bp=new BookPage();
    Visitor *fp=new FilePage();
    book->Accept(bp);
    file->Accept(fp);
    return 0;
}

访问者模式的优点在于可以将处理和数据结构分离开,并且灵活的添加处理,但是前提是我们的数据结构相当的稳定如果需要创建新的数据结构那么不要使用访问者模式。每增加一个新的操作就增加一个新的访问者,访问者只需要传入数据,那么在数据对象中对访问者提供接口,再将自己的数据传入访问者即可


访问者的缺点就是将添加新的数据结构变得困难。

相关文章
|
3月前
|
设计模式 Java
访问者模式问题之在不使用访问者模式的情况下,怎么在一个 SelectNode 类中实现 extractFunctions 方法
访问者模式问题之在不使用访问者模式的情况下,怎么在一个 SelectNode 类中实现 extractFunctions 方法
|
6月前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
73 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
设计模式 算法 BI
设计模式~访问者模式(Visitor)-15
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对
45 0
|
设计模式 Java 关系型数据库
访问者模式解读
访问者模式解读
今天说说你不知道的访问者模式
今天说说你不知道的访问者模式
76 0
|
设计模式 算法 Java
Java设计模式-访问者模式(Visitor)
Java设计模式-访问者模式(Visitor)
|
算法 Java 编译器
行为型模式 - 访问者模式(Visitor Pattern)
行为型模式 - 访问者模式(Visitor Pattern)
|
设计模式 程序员
访问者模式是啥?咋实现呀?
访问者模式是啥?咋实现呀?
|
设计模式
我学会了,访问者模式
访问者模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
114 0
我学会了,访问者模式