设计模式之访问者模式

2019-04-20  本文已影响0人  古月沧澜

一、例子

案列内容

代码

     抽象元素类
     ```
     ```
     普通员工类
    ```
    ```
     管理员类
    ```
    ```
     访问者类
     ```
     ```
     场景类
     ```
     ```


     运行结果

二、模式讲解

含义:

设计图

角色:

  1. 抽象元素类:

2.具体元素类:

3.抽象访问者类:定义方法方法和访问对象

4.具体访问者类:实现具体的访问方法

5.对象结构:元素的产生者,一般是包含多个不同对象,多个不同接口的容器,一般不抽象出类的,可以是Map.List,Set等。

通用类代码

三、优劣势

优势:

1.符合单一职责原则,Element抽象出两个子类负责对数据的加载,访问者类Visitor负责对数据进行报表的展现,二者分工明确,各自演绎变化。
2.非常容易扩展,在不影响数据结构的基础上可以增加新的操作,增加访问者或者增加在访问者中增加新的方法。
3.灵活程度高,例如进行数据统计的时候,按照上面的例子统计所有的员工工资的总和,不同岗位的系数不同,普通员工1.2,经理1.3,主管1.5,统计的时候用for循环进行统计结算,然后用instance of进项判断的话,比较麻烦,可以选择用访问者模式进行统计。

劣势:

1.对象元素对访问者公开比较多的细节,访问者类访问了对象的内部细节,这违背了迪米特法则
2.对象元素新增、修改、删除字段不太容易,对应的访问者类会需要新增数据
3.不符合依赖倒置的原则,访问者依赖的是具体的对象那个而不是抽象对象

四、适用场景

业务规则需要遍历多个对象,迭代器模式只能遍历相同的对象,当需要遍历不同的对象,并且对不同的对象有不同的操作时,一定要考虑使用访问者模式,访问者模式是对迭代器模式的扩展。访问者模式可以用作拦截器的功能。

五、扩展

访问者模式适用于项目大规模的重构,一般适用于项目的需求非常明确,功能点也已经明确,可以通过访问者模式很容易的对原有功能进行规划重整,达到最终目的,功能集中化

六、双分派

上一篇下一篇

猜你喜欢

热点阅读