【设计模式系列】访问者模式

237 阅读3分钟

“这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

欢迎各位朋友微信搜索「Andy阿辉」关注一波!

写一些程序员的所思所想,希望对你有帮助。

原文链接:设计模式之访问者 (qq.com)

访问者模式介绍

访问者模式能将算法与其所作用的对象隔离开来。

访问者模式建议将新行为放入要给名为访问者的独立类中,而不是试图将其整合到已有类中。

它允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为。

需要执行操作的原始对象将作为参数被传递给访问者中的方法,让方法能访问对象所包含的一切必要数据。

简单理解下什么是访问者,这里使用保险代理人拜访不同层次的客户时为例子。他会根据不同的客户,推荐不同的保单。

  • 普通农民工,推荐医疗保险。
  • 普通打工人,推荐医疗保险和财产保险。
  • 企业家,推荐理财保险,年金等。

访问者模式结构

  • 访问者接口

声明一系列以对象结构的具体元素为参数的访问者方法。

  • 具体访问者

会为不同的具体元素类实现相同行为的几个不同版本。

  • 元素接口

声明一个方法来接收访问者。该方法必须有一个参数被声明为访问者接口类型。

  • 具体元素

实现元素接口方法,该方法的目的是根据当前元素类将其调用重定向到相应访问者的方法(注意:即使基类实现了此方法,所有子类都必须对其进行重写并调用访问者对象中的合适方法)。

  • 客户端

作为集合或其他复杂对象的代表。

适合应用场景

  • 需要对一个复杂对象结构中所有元素执行某些操作时。
  • 使用访问者模式来清理辅助行为的业务逻辑时。
  • 当某个行为只在类层次有意义,而在其他类中没有意义时。

实现方式

1、在访问者接口中声明一组“访问”方法,分别对应程序中的每个具体元素类。

2、声明元素接口,在具体原始类中实现接收方法。

3、元素类只能通过访问者接口与访问者进行交互(访问者必须知晓所有具体的元素类)。

4、为每个无法在元素层次结构中实现的行为创建一个具体访问者并实现所有的访问者方法。

5、客户端必须创建访问者对象并通过“接收”方法将其传递给元素。

优点

1、满足开闭原则和单一职责原则。

2、访问者对象可以在与各种对象交互时收集一些有用的信息。

缺点

1、每次在元素层次结构中添加或移除一个类时,你都要更新所有的访问者。

2、在访问者同某个元素进行交互时,它们可能没有访问元素私有成员变量和方法的必要权限。

Demo

元素接口与元素接口实现

元素接口与元素接口实现

访问者接口与接口实现

访问者接口与接口实现

客户端代码与Main()调用

客户端代码与Main()调用

访问者模式在常规的编码生活中很少会去使用,我们只需要掌握其原理就可以。对于在实际开发过程中,如果有满足此模式的业务,则可对其进行分解,按照访问者模式的结构进行构建即可。

显示结果

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。