一、例子
案列内容
代码
抽象元素类
```
```
普通员工类
```
```
管理员类
```
```
访问者类
```
```
场景类
```
```
运行结果
二、模式讲解
含义:
设计图
角色:
- 抽象元素类:
2.具体元素类:
3.抽象访问者类:定义方法方法和访问对象
4.具体访问者类:实现具体的访问方法
5.对象结构:元素的产生者,一般是包含多个不同对象,多个不同接口的容器,一般不抽象出类的,可以是Map.List,Set等。
通用类代码
三、优劣势
优势:
1.符合单一职责原则,Element抽象出两个子类负责对数据的加载,访问者类Visitor负责对数据进行报表的展现,二者分工明确,各自演绎变化。
2.非常容易扩展,在不影响数据结构的基础上可以增加新的操作,增加访问者或者增加在访问者中增加新的方法。
3.灵活程度高,例如进行数据统计的时候,按照上面的例子统计所有的员工工资的总和,不同岗位的系数不同,普通员工1.2,经理1.3,主管1.5,统计的时候用for循环进行统计结算,然后用instance of进项判断的话,比较麻烦,可以选择用访问者模式进行统计。
劣势:
1.对象元素对访问者公开比较多的细节,访问者类访问了对象的内部细节,这违背了迪米特法则
2.对象元素新增、修改、删除字段不太容易,对应的访问者类会需要新增数据
3.不符合依赖倒置的原则,访问者依赖的是具体的对象那个而不是抽象对象
四、适用场景
业务规则需要遍历多个对象,迭代器模式只能遍历相同的对象,当需要遍历不同的对象,并且对不同的对象有不同的操作时,一定要考虑使用访问者模式,访问者模式是对迭代器模式的扩展。访问者模式可以用作拦截器的功能。
五、扩展
访问者模式适用于项目大规模的重构,一般适用于项目的需求非常明确,功能点也已经明确,可以通过访问者模式很容易的对原有功能进行规划重整,达到最终目的,功能集中化
网友评论