极速理解设计模式系列: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 下载。




本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/10/24/2214033.html,如需转载请自行联系原作者


相关文章
|
3天前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
30 1
|
3天前
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
3天前
|
设计模式 安全 Java
【设计模式】字节三面:请举例阐释访问者模式
【设计模式】字节三面:请举例阐释访问者模式
8 2
|
3天前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
44 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
3天前
|
设计模式 Java 应用服务中间件
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
37 1
|
3天前
|
设计模式 Go
[设计模式 Go实现] 行为型~访问者模式
[设计模式 Go实现] 行为型~访问者模式
|
3天前
|
设计模式 算法 编译器
【设计模式系列笔记】访问者模式
访问者模式是一种行为设计模式,旨在将算法与对象结构分离,使得能够在不修改元素类的前提下定义新的操作。这一模式的核心思想是在元素类中添加一个接受访问者的方法,从而实现在不同元素上执行不同操作的能力。
33 0
|
3天前
|
设计模式 算法 Java
小谈设计模式(29)—访问者模式
小谈设计模式(29)—访问者模式
|
3天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
16 1
|
3天前
|
设计模式 算法 Java
23种设计模式,访问者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】访问者模式是一种将算法与对象结构分离的设计模式。这种模式主要用于执行一个操作(或一组操作)在一个对象结构的各元素上,它可以在不修改各元素的类的前提下定义新的操作。
19 2