Java设计模式(访问者模式)

前言

最近在学习Groovy,无意中看到了里面谈到的访问者的设计模式,一直对设计模式似懂非懂,所以静下心来研究一下访问者模式。
这篇文章写的很不错,耐心看完后,算是对访问者模式有一点了解。记录一下,帮助自己记忆。
https://www.jianshu.com/p/62289b9bcfcb

访问者设计模式

1.定义

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

2.模式结构和说明

Visitor:访问者接口,为所有的访问者对象声明一个visit方法,用来代表为对象结构添加的功能,理论上可以代表任意的功能。
ConcreteVisitor:具体的访问者实现对象,实现要真正被添加到对象结构中的功能。
Element:抽象的元素对象,对象结构的顶层接口,定义接受访问的操作。
ConcreteElement:具体元素对象,对象结构中具体的对象,也是被访问的对象,通常会回调访问者的真实功能,同时开放自身的数据供访问者使用。
ObjectStructure:对象结构,通常包含多个被访问的对象,它可以遍历这多个被访问的对象,也可以让访问者访问它的元素。可以是一个复合或是一个集合,如一个列表或无序集合。

3.本质

访问者模式的本质就是具体元素对象预留了一个accept接口,用来回调访问者的vistor接口。
这样针对不同的元素对象,可以有许多访问者来实现访问,具体访问的实现逻辑写在访问者上面,这样就不会破幻元素对象原有的数据结构,可以透明的为这些元素对象定义新的操作。

4.举例说明

元素对象抽象类:用户
元素对象实现A:个人用户
元素对象实现B:企业用户

访问者A:统计用户行为习惯
访问者B:统计用户注册群体

这样访问这A可以根据不同元素对象,实现统计不同类型的行为习惯。
(比如个人用户主要用来统计购买哪些产品,企业用户用来统计批发哪些产品)
统计用户注册群体,同理可以实现个人用户和企业用户的不同类型的群体。
(个人可能按年龄或者性别或者职业分类,企业可能按公司类型,公司办公地点分类)

最后会创建一个对象结构,他会包含个人用户和企业用户的信息,然后可以添加多个访问者,访问者会访问对象结构里不同的对象元素。

5.组合模式和访问者模式结合

访问者模式很多时候跟组合模式结合起来使用。
因为很多对象元素是一个组合的形式。
举个例子:
元素对象抽象类:手机
组合元素对象:苹果手机
子类元素对象:iPhone X
子类元素对象:iPhone 8
组合元素对象:安卓手机
子类元素对象:华为P30
子类元素对象:华为Mate10

访问者A:统计手机电量容量
访问者B:统计手机分辨率

由于不同手机获取电池容量,获取手机分辨率的方法肯定不太一样,所以具体实现在观察着里面实现。
同样,创建一个对象结构,这里对象结构可以只包含组合对象的信息。然后执行时传入访问者,访问者调用组合对象的accept,组合对象的accept即遍历子类元素的accept。然后调用到访问者的vistor方法。因为对象元素的accept可以根据对象元素是组合元素,则调用访问者的Vistor组合,是子类元素的,可以调用访问者的Vistor子类。也可以根据元素的类型,判断Vistor苹果,还是vistor安卓。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值