一、访问者模式
对于一组对象,在不改变数据结构的前提下,增加作用于这些结构元素新的功能。
适用于数据结构相对稳定,它把数据结构和作用于其上的操作解耦,使得操作集合可以相对自由地演化。
二、示例
员工管理系统:本系统需要根据所有员工的剩余年假计算折现的假期补贴薪资
传统方法只需在员工管理的类中定义一个计算薪资的方法,循环遍历所有员工调用该计算方法即可
1.定义员工对象类
1 |
|
2.定义员工管理类并实现计算方法
1 |
|
3.循环遍历即可
1 |
|
缺点:
- 员工集合的管理应该和操作方法分开,实现解耦
- 不利于拓展,若后续新增其他计算操作,则管理类只会越来越复杂,并且可能会相互影响
三、访问者模式的改进
访问者模式将数据的管理和对象的操作拆分,将对象定义成被访问者,不同的操作定义成访问对象的访问者,不同的访问者只需处理自己应该实现的操作方法即可
1.定义对象的超类,用于注入访问者
1 |
|
2.定义被对象,并实现注入方法
1 |
|
3.定义访问者接口
1 | /** |
4.定义计算薪资的访问者,实现自定义的计算方法
1 |
|
5.定义管理类,对象的操作通过访问者调用
1 |
|
1 |
|
四、总结
优点:
- 符合单一职责原则
- 扩展性良好
- 有益于系统的管理和维护
缺点:
- 增加新的元素类变得很困难
- 破坏封装性
适用场合:
- 如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式就是比较合适的
Java设计模式所有示例代码,持续更新中