设计模式之访问者模式
访问者模式是一种复杂的行为模式。表示要对对象结构的元素执行的操作。访问者允许对对象结构中的节点定义新操作,而无需更改其操作的元素的类。
适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
应用场景
当遇到如下情况时,可以优先考虑使用访问者模式:
- 对象结构中包含许多具有不同接口的对象类,并且希望对依赖于其具体类的这些对象执行操作。
- 需要对对象结构中的对象执行许多不同且不相关的操作,并且希望避免使用这些操作“污染”它们的类。这时就可以定义多个visitor类来完成对多个对象节点的处理。
- 定义对象结构的类很少改变,但是你经常想要在结构上定义新的操作。
模式结构
举个例子:在公司中,需要统计打卡记录和绩效,分别有行政部门和财务部门来实现。并且将来可能有质量部门监测研发和实施人员的工作质量。但是对研发和实施人员的考核标准有所不同。
一、类图
OperateStructure
作为对象OperateNode
的数据结构,并且实现类OperateNodeA
和OperateNodeB
行为方法有各自的实现。并且想基于这个相对固定的数据结构实现多种不同的操作(visitor)
。这样在增加visitor
的时候不必考虑数据结构会发生变更。
二、时序
由于调用过程比较不容易看透,这里我先使用时序图来说明调用顺序
代码实例
根据类图可以看出,访问者模式分为五部分:抽象节点角色 、具体节点角色 、抽象访问者角色 、具体访问者角色 、结构对象角色
- 抽象节点角色:
1 | public abstract class OperateNode { |
- 具体节点角色:
1 | // 具体节点A 在实例中对应研发人员 |
- 抽象访问者角色
1 | //针对结构中每一个节点分别进行各自的操作 |
- 具体访问者角色
1 | // 行政人员结算考勤 |
- 结构对象结构
1 | public class OperateStructure { |
- 客户端调用
1 | public class App { |
- 结果
1 | 本月该研发人员考勤为22天 |