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

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

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

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

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

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

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

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

类图:

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

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

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

        一、抽象访问者(Visitor):

 

  1. //抽象访问者(Visitor) 
  2. abstract class Visitor 
  3.     public abstract void VisitBlog(Element element); 

        二、具体访问者(ConcreteVisitor):

 

  1. //具体访问者(ConcreteVisitor) 
  2. class WebVisitor : Visitor 
  3.     public override void VisitBlog(Element element) 
  4.     { 
  5.         Console.WriteLine("通过电脑web网站方式访问Blog:" + element.BlogName); 
  6.     } 
  7. //具体访问者(ConcreteVisitor) 
  8. class WapVisitor : Visitor 
  9.     public override void VisitBlog(Element element) 
  10.     { 
  11.         Console.WriteLine("通过手机wap网站方式访问Blog:" + element.BlogName); 
  12.  
  13.     }   

        三、抽象元素(Element):

 

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

        四、具体元素(ConcreteElement):

 

  1. //具体元素(ConcreteElement) 
  2. class BlogElement : Element 
  3.     public BlogElement(string blogname) 
  4.     { 
  5.         this.BlogName = blogname; 
  6.     } 
  7.     public override void Accept(Visitor visitor) 
  8.     { 
  9.         visitor.VisitBlog(this); 
  10.     } 

        五、对象结构类(ObjectStructure):

 

  1. //对象结构类(ObjectStructure) 
  2. class Blogs 
  3.     private IList<Element> blogList = new List<Element>(); 
  4.  
  5.     public void AddBlog(Element element) 
  6.     { 
  7.         blogList.Add(element); 
  8.     } 
  9.  
  10.     public void RemoveBlog(Element element) 
  11.     { 
  12.         blogList.Remove(element); 
  13.     } 
  14.     public void Accept(Visitor visitor) 
  15.     { 
  16.         foreach (Element e in blogList) 
  17.             e.Accept(visitor); 
  18.     } 

        六、客户端(Client) :

 

  1. //客户端(Client) 
  2. class Program 
  3.     static void Main(string[] args) 
  4.     { 
  5.         Blogs blogs = new Blogs(); 
  6.         blogs.AddBlog(new BlogElement("这是第一篇博文")); 
  7.         blogs.AddBlog(new BlogElement("这是第二篇博文")); 
  8.         blogs.AddBlog(new BlogElement("这是第三篇博文")); 
  9.         blogs.AddBlog(new BlogElement("这是第四篇博文")); 
  10.  
  11.         Visitor webVisit = new WebVisitor(); 
  12.         Visitor wapVisit = new WapVisitor(); 
  13.  
  14.         blogs.Accept(webVisit); 
  15.         blogs.Accept(wapVisit); 
  16.         Console.ReadLine(); 
  17.     } 

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