极速理解设计模式系列:18.访问者模式(Visitor Pattern)
2011-10-24 12:32
543 查看
六个角色:抽象访问者(Visitor)、具体访问者(ConcreteVisitor)、抽象元素(Element)、具体元素(ConcreteElement)、对象结构类(ObjectStructure)、客户端(Client)
抽象访问者(Visitor):抽象出访问元素的动作
具体访问者(ConcreteVisitor):实现访问元素的动作
抽象元素(Element):定义一个接受访问的操作,其参数为访问者
具体元素(ConcreteElement):实现接受访问操作
对象结构类(ObjectStructure):可以枚举元素,并且管理元素
客户端(Client) :定义元素集合,然后接受不同访问者的访问
实现思路:向对象结构类中添加元素,然后定义多种访问者,使用对象结构类去接受访问者即可。
[b]类图:[/b]
应用场景:用户去访问博客
分析:用户可以通过电脑上的Web方式(访问者)或者手机Wap方式(访问者)去访问博客,每篇博客是一个元素,然后博客列表是一个对象结构类。
下面我们在控制台程序去演示一下如何使用Visitor Pattern:
一、抽象访问者(Visitor):
二、具体访问者(ConcreteVisitor):
三、抽象元素(Element):
四、具体元素(ConcreteElement):
五、对象结构类(ObjectStructure):
六、客户端(Client) :
如需源码请点击 VisitorPattern.rar 下载。
抽象访问者(Visitor):抽象出访问元素的动作
具体访问者(ConcreteVisitor):实现访问元素的动作
抽象元素(Element):定义一个接受访问的操作,其参数为访问者
具体元素(ConcreteElement):实现接受访问操作
对象结构类(ObjectStructure):可以枚举元素,并且管理元素
客户端(Client) :定义元素集合,然后接受不同访问者的访问
实现思路:向对象结构类中添加元素,然后定义多种访问者,使用对象结构类去接受访问者即可。
[b]类图:[/b]
应用场景:用户去访问博客
分析:用户可以通过电脑上的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 下载。
相关文章推荐
- 极速理解设计模式系列:18.访问者模式(Visitor Pattern)
- 极速理解设计模式系列:2.观察者模式(Observer Pattern)
- 极速理解设计模式系列:3.代理模式(Proxy Pattern)
- 极速理解设计模式系列:15.中介者模式(Mediator Pattern)
- 极速理解设计模式系列:17.命令模式(Command Pattern)
- 极速理解设计模式系列:6.适配器模式(Adapter Pattern)
- 极速理解设计模式系列:15.中介者模式(Mediator Pattern)
- 极速理解设计模式系列:21.简单工厂模式(Simple Factory Pattern)
- 极速理解设计模式系列:6.适配器模式(Adapter Pattern)
- 极速理解设计模式系列:11.单例模式(Singleton Pattern)
- 极速理解设计模式系列:1.建造者模式(Builder Pattern)
- 极速理解设计模式系列:20.模板方法模式(Template Method Pattern)
- 极速理解设计模式系列【目录索引】
- 极速理解设计模式系列:21.简单工厂模式(Simple Factory Pattern)
- 极速理解设计模式系列
- 极速理解设计模式系列:8.策略模式(Strategy Pattern)
- 极速理解设计模式系列:11.单例模式(Singleton Pattern)
- 极速理解设计模式系列:13.外观模式(Facade Pattern)
- 极速理解设计模式系列:1.建造者模式(Builder Pattern)
- 极速理解设计模式系列:24.解释器模式(Interpreter Pattern)