zoukankan      html  css  js  c++  java
  • 极速理解设计模式系列:18.访问者模式(Visitor Pattern)

    六个角色:抽象访问者(Visitor)、具体访问者(ConcreteVisitor)、抽象元素(Element)、具体元素(ConcreteElement)、对象结构类(ObjectStructure)、客户端(Client) 

            抽象访问者(Visitor):抽象出访问元素的动作

            具体访问者(ConcreteVisitor):实现访问元素的动作

            抽象元素(Element):定义一个接受访问的操作,其参数为访问者

            具体元素(ConcreteElement):实现接受访问操作

            对象结构类(ObjectStructure):可以枚举元素,并且管理元素

            客户端(Client) :定义元素集合,然后接受不同访问者的访问

    实现思路:向对象结构类中添加元素,然后定义多种访问者,使用对象结构类去接受访问者即可。

    类图:

     

    应用场景:用户去访问博客

    分析:用户可以通过电脑上的Web方式(访问者)或者手机Wap方式(访问者)去访问博客,每篇博客是一个元素,然后博客列表是一个对象结构类。

            下面我们在控制台程序去演示一下如何使用Visitor Pattern:

            一、抽象访问者(Visitor):

        //抽象访问者(Visitor)
    abstract class Visitor
    {
    public abstract void VisitBlog(Element element);
    }

            二、具体访问者(ConcreteVisitor):

        //具体访问者(ConcreteVisitor)
    class WebVisitor : Visitor
    {
    public override void VisitBlog(Element element)
    {
    Console.WriteLine("通过电脑web网站方式访问Blog:" + element.BlogName);
    }
    }
    //具体访问者(ConcreteVisitor)
    class WapVisitor : Visitor
    {
    public override void VisitBlog(Element element)
    {
    Console.WriteLine("通过手机wap网站方式访问Blog:" + element.BlogName);

    }
    }

            三、抽象元素(Element):

        //抽象元素(Element)
    abstract class Element
    {
    public string BlogName { get; set; }
    abstract public void Accept(Visitor visotr);
    }

            四、具体元素(ConcreteElement):

        //具体元素(ConcreteElement)
    class BlogElement : Element
    {
    public BlogElement(string blogname)
    {
    this.BlogName = blogname;
    }
    public override void Accept(Visitor visitor)
    {
    visitor.VisitBlog(this);
    }
    }

            五、对象结构类(ObjectStructure):

        //对象结构类(ObjectStructure)
    class Blogs
    {
    private IList<Element> blogList = new List<Element>();

    public void AddBlog(Element element)
    {
    blogList.Add(element);
    }

    public void RemoveBlog(Element element)
    {
    blogList.Remove(element);
    }
    public void Accept(Visitor visitor)
    {
    foreach (Element e in blogList)
    e.Accept(visitor);
    }
    }

            六、客户端(Client) :

        //客户端(Client)
    class Program
    {
    static void Main(string[] args)
    {
    Blogs blogs = new Blogs();
    blogs.AddBlog(new BlogElement("这是第一篇博文"));
    blogs.AddBlog(new BlogElement("这是第二篇博文"));
    blogs.AddBlog(new BlogElement("这是第三篇博文"));
    blogs.AddBlog(new BlogElement("这是第四篇博文"));

    Visitor webVisit = new WebVisitor();
    Visitor wapVisit = new WapVisitor();

    blogs.Accept(webVisit);
    blogs.Accept(wapVisit);
    Console.ReadLine();
    }
    }

            如需源码请点击 VisitorPattern.rar 下载。

  • 相关阅读:
    2014编程之美资格赛 第二题 大神和三个小伙伴
    操作系统PV操作——进程同步问题(C#实现)
    [转_管理]成功者必备的15种能力
    [技术相关]List、Dictionary转Dictionary的性能分析
    [项目管理]怎样评定软件开发成果的质量
    Visual Studio 2013 RTM 中文语言包官方下载地址发布
    IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET
    HTTP请求方式中get和post的区别
    asp.net之动态页面和静态页面的区别
    HTML语言语法大全
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/2214033.html
Copyright © 2011-2022 走看看