前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫谈模式之访问者模式

漫谈模式之访问者模式

作者头像
孟君
发布2023-03-26 08:20:20
6400
发布2023-03-26 08:20:20
举报

今天,我们来分享行为型模式的另外一个成员:访问者模式

访问者模式是一种行为型模式,它允许你定义一个作用于某个对象结构中的各个元素的操作,而同时又不改变这些元素的类。该模式的核心思想是将数据结构与数据操作分离,从而可以在不改变数据结构的前提下定义新的操作。

有的时候,由于访问者所关注的点不同,可以需要对同样的一件事物做出不同的回应和操作。比如:在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量进行划价;而药房工作人员则根据药品名称和数量准备药品;针对同样的处方笺,划价人员和药房工作人员作为处方笺的访问者,其做的操作是不一样的。

一个处方笺如下图所示:

图片
图片

本文今天要讲访问者模式,就是可以使你在不改变各元素的累的前提下,定义作用于这些元素的新操作,从而可以满足不同的访问者访问的场景。

访问者模式的基本介绍

意图

访问者模式是对象的行为模式,其表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

结构

访问者模式的基本结构如下:

图片
图片

这里涉及到的参与者有如下几种:

Visitor(访问者)

声明一个或者多个访问操作

ConcreteVistor(具体的访问者)

实现Visitor声明的所有接口,也就是访问者所声明的各个访问操作。

Element(元素)

定义一个Accept操作,接受一个访问者对象作为一个参数。

ConcreteElement(具体元素)

实现Accept操作,该操作以一个访问者为参数

ObjectStructure(对象结构)

  • 可以遍历结构中的所有元素
  • 可以提供一个高层的接口以允许该访问它的元素
  • 可以设计成一个复合对象或者一个集合,如一个列表(List)或者集合(Set)

访问者模式的示例

接下来以一个图形(包括圆形、长方形))输出XML和JSON字串来完成一个简单的访问者模式的示例:

元素Shape.java

图片
图片

具体元素素类Circle.java和Rectangle.java

图片
图片
图片
图片

访问者PrintVisitor.java

图片
图片

具体访问者JSONPrintVisitor.java和XMLPrintVisitor.java

图片
图片
图片
图片

客户端Client

图片
图片

输出结果:

图片
图片

从上述输出结果中,我们可以可能看到针对一样的数据集,采用不同的访问者可以获取不一样的操作,JSON访问者看到json格式的打印;XML访问者则看到xml格式的打印。

再举一个例子

假设我们有一个文件File和文件夹Directory的列表,我们可以通过不同的过滤器访问者,可以从相同的列表中获取不同的结果集;比如输出名字以java开头的文件和文件夹。

元素Element以及具体元素File和Directory

图片
图片
图片
图片

访问者和具体访问者

图片
图片

客户端Client

图片
图片

输出结果:

图片
图片

同样,在没有改变原来元素的类的前提下,我们通过定义了作用于这些元素的不一样的操作。

访问者模式的优缺点

优点

  • 访问者模式使得易于增加新的操作。如果一些操作依赖于一个复杂的结构对象的话,那么一般而言,增加新的操作会很复杂。而使用访问者模式,增加新的操作就意味着增加一个新的访问者类,因此,变得很容易。
  • 访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。

缺点

  • 增加新的ConcreteVisitor类变得很困难。每增加一个新的节点都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作。
  • 破坏封装。访问者方法假定ConcreteElement接口的功能足够强,足以让访问者进行它们的工作。结果是,该模式常常迫使你提供访问元素内部状态的公共操作,这可能会破坏它的封装性。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 访问者模式的基本介绍
  • 访问者模式的示例
  • 访问者模式的优缺点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档