zoukankan      html  css  js  c++  java
  • 访问者模式(Visitor)

    2015/5/25
    访问者模式(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;
    }

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

  • 相关阅读:
    C# partial 作用
    C#中internal关键字是什么意思?什么叫做“只能在包含它的程序集中访问该方法”
    [转]利用.NET中的反射机制实现IList到DataTable的转换
    你可能已经知道或者不知道的ASP.NET 2.0技巧
    SQL Server基本函数详细介绍--字符串函数
    在Web.config配置文件中自定义配置节点
    SQL SERVER事务处理
    专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)
    SQL SERVER 高效存储过程分页(Max/Min方法)
    该字符串未被识别为有效的 DateTime
  • 原文地址:https://www.cnblogs.com/pzqu/p/9457638.html
Copyright © 2011-2022 走看看