今天,我们来分享行为型模式的另外一个成员:访问者模式。
访问者模式是一种行为型模式,它允许你定义一个作用于某个对象结构中的各个元素的操作,而同时又不改变这些元素的类。该模式的核心思想是将数据结构与数据操作分离,从而可以在不改变数据结构的前提下定义新的操作。
有的时候,由于访问者所关注的点不同,可以需要对同样的一件事物做出不同的回应和操作。比如:在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量进行划价;而药房工作人员则根据药品名称和数量准备药品;针对同样的处方笺,划价人员和药房工作人员作为处方笺的访问者,其做的操作是不一样的。
一个处方笺如下图所示:
本文今天要讲访问者模式,就是可以使你在不改变各元素的累的前提下,定义作用于这些元素的新操作,从而可以满足不同的访问者访问的场景。
意图
访问者模式是对象的行为模式,其表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
结构
访问者模式的基本结构如下:
这里涉及到的参与者有如下几种:
Visitor(访问者)
声明一个或者多个访问操作
ConcreteVistor(具体的访问者)
实现Visitor声明的所有接口,也就是访问者所声明的各个访问操作。
Element(元素)
定义一个Accept操作,接受一个访问者对象作为一个参数。
ConcreteElement(具体元素)
实现Accept操作,该操作以一个访问者为参数
ObjectStructure(对象结构)
接下来以一个图形(包括圆形、长方形))输出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
输出结果:
同样,在没有改变原来元素的类的前提下,我们通过定义了作用于这些元素的不一样的操作。
优点
缺点
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。