如何让孩子爱上设计模式 ——21.访问者模式(Visitor Pattern)
标签: 设计模式初涉
描述性文字
本节讲解的访问者模式相比起上一节的解释器模式显得稍微易懂一些,
核心其实就是:数据结构不变,操作可变,结构与操作解耦的一种模式。
同样是先走一波概念,然后写个简单的代码示例帮助理解。
概念相关
定义
封装一些作用域某种数据结构中的个元素的操作,在不改变这个数据结构的
前提下,定义作用于这些元素的新的操作。
五个角色
- Visitor:抽象访问者,为每一个具体访问者角色创建一个访问操作接口。
- ConcreteVisitor:具体访问者,实现 Vistor 接口,并实现独自的操作。
- Element:元素角色,定义一个接收访问者方法,以访问者作为参数。
- ConcreteElement:具体元素角色,实现Element接口并实现接收操作。
- ObjectStructure:对象结构,使访问者能够访问到对应的元素。
UML类图
使用场景
- 定义复杂的类很少做修改,但经常需要向其添加新的操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让
这些操作”污染”这些对象的类,使用访问者模式将这些封装到类中。
优缺点
优点
- 1.好的扩展性,能在不修改结构元素情况下,为元素添加新功能;
- 2.好的复用性,通过访问者来定义整个对象结构统一的功能,从而提高复用程度;
- 3.分离无关行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一。
缺点
- 1.不适用于结构中类经常变化的情况
- 2.破坏封装性,具体元素对访问者公布细节
代码示例
刚好昨天和前天都去游戏机厅玩了,这里用访问者模式写个男女玩家访问游戏机厅
投篮机,跳舞机和开车的例子吧。
先定义元素角色,游戏机接口,只有一个传入访问者实例的方法
接着实现这个接口,定义具体元素,投篮机,跳舞机和开车
再接着写抽象访问者,因为有三个元素,我们写三个访问的方法,传入对应的元素实例
然后实现抽象访问者,写两个具体访问者,男性玩家与女性玩家
另外,还要定义一个对象结构,用来管理元素集合,并且可以迭代供访问者访问
最后客户端调用
输出结果
代码比较简单,就不解释了~
本节代码示例
https://github.com/coder-pig/DesignPatternsExample/tree/master/20.Visitor%20Pattern