六个角色:抽象访问者(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();
- }
- }
如需源码请点击 下载。
本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827040