首页 > 其他分享 >Book-深入设计模式-访问者模式

Book-深入设计模式-访问者模式

时间:2023-03-06 23:00:33浏览次数:43  
标签:对象 元素 模式 Book 设计模式 方法 类中 访问者

Book-深入设计模式-访问者模式

https://refactoringguru.cn/design-patterns/visitor

访问者模式
亦称: Visitor

访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。


访问者模式建议将新行为放入一个名为访问者的独立类中, 而不是试图将其整合到已有类中。 现在, 需要执行操作的原始对象将作为参数被传递给访问者中的方法, 让方法能访问对象所包含的一切必要数据。

使用了一种名为双分派的技巧, 不使用累赘的条件语句也可下执行正确的方法。 与其让客户端来选择调用正确版本的方法, 不如将选择权委派给作为参数传递给访问者的对象。 由于该对象知晓其自身的类, 因此能更自然地在访问者中选出正确的方法。 它们会 “接收” 一个访问者并告诉其应执行的访问者方法。

最终还是修改了节点类, 但毕竟改动很小, 且使得我们能够在后续进一步添加行为时无需再次修改代码。

现在, 如果我们抽取出所有访问者的通用接口, 所有已有的节点都能与我们在程序中引入的任何访问者交互。 如果需要引入与节点相关的某个行为, 你只需要实现一个新的访问者类即可。


访问者模式结构

![](.\visitor structure.png)
visitor structure

访问者模式适合应用场景

  1. 如果你需要对一个复杂对象结构 (例如对象树) 中的所有元素执行某些操作, 可使用访问者模式。
    访问者模式通过在访问者对象中为多个目标类提供相同操作的变体, 让你能在属于不同类的一组对象上执行同一操作。

  2. 可使用访问者模式来清理辅助行为的业务逻辑。
    该模式会将所有非主要的行为抽取到一组访问者类中, 使得程序的主要类能更专注于主要的工作。

  3. 当某个行为仅在类层次结构中的一些类中有意义, 而在其他类中没有意义时, 可使用该模式。
    你可将该行为抽取到单独的访问者类中, 只需实现接收相关类的对象作为参数的访问者方法并将其他方法留空即可。

实现方式

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

  2. 声明元素接口。 如果程序中已有元素类层次接口, 可在层次结构基类中添加抽象的 “接收” 方法。 该方法必须接受访问者对象作为参数。

  3. 在所有具体元素类中实现接收方法。 这些方法必须将调用重定向到当前元素对应的访问者对象中的访问者方法上。

  4. 元素类只能通过访问者接口与访问者进行交互。 不过访问者必须知晓所有的具体元素类, 因为这些类在访问者方法中都被作为参数类型引用。

  5. 为每个无法在元素层次结构中实现的行为创建一个具体访问者类并实现所有的访问者方法。
    你可能会遇到访问者需要访问元素类的部分私有成员变量的情况。 在这种情况下, 你要么将这些变量或方法设为公有, 这将破坏元素的封装; 要么将访问者类嵌入到元素类中。 后一种方式只有在支持嵌套类的编程语言中才可能实现。

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

访问者模式优缺点

优点

  • 开闭原则。 你可以引入在不同类对象上执行的新行为, 且无需对这些类做出修改。
  • 单一职责原则。 可将同一行为的不同版本移到同一个类中。
  • 访问者对象可以在与各种对象交互时收集一些有用的信息。 当你想要遍历一些复杂的对象结构 (例如对象树), 并在结构中的每个对象上应用访问者时, 这些信息可能会有所帮助。

缺点

  • 每次在元素层次结构中添加或移除一个类时, 你都要更新所有的访问者。
  • 在访问者同某个元素进行交互时, 它们可能没有访问元素私有成员变量和方法的必要权限。

与其他模式的关系

  • 你可以将访问者模式视为命令模式的加强版本, 其对象可对不同类的多种对象执行操作。

  • 你可以使用访问者对整个组合模式树执行操作。

  • 可以同时使用访问者和迭代器模式来遍历复杂数据结构, 并对其中的元素执行所需操作, 即使这些元素所属的类完全不同。

标签:对象,元素,模式,Book,设计模式,方法,类中,访问者
From: https://www.cnblogs.com/yongchao/p/17185842.html

相关文章

  • Book-深入设计模式-策略模式
    Book-深入设计模式-策略模式https://refactoringguru.cn/design-patterns/strategy策略模式亦称:Strategy策略模式是一种行为设计模式,它能让你定义一系列算法,并将每......
  • Book-深入设计模式-中介者模式
    Book-深入设计模式-中介者模式https://refactoringguru.cn/design-patterns/mediator中介者模式亦称:调解人、控制器、Intermediary、Controller、Mediator中介者模式......
  • Book-深入设计模式-代理模式
    Book-深入设计模式-代理模式https://refactoringguru.cn/design-patterns/proxy代理模式亦称:Proxy代理模式是一种结构型设计模式,让你能够提供对象的替代品或其占位符......
  • 设计模式
    设计原则solid1、开闭原则(OpenClosePrinciple)开闭原则的意思是:对扩展开放,对修改关闭。2、里氏代换原则(LiskovSubstitutionPrinciple)里氏代换原则是面向对象设计的......
  • Book-深入设计模式-享元模式
    Book-深入设计模式-享元模式https://refactoringguru.cn/design-patterns/flyweight享元模式亦称:缓存、Cache、Flyweight享元模式是一种结构型设计模式,它摒弃了在每......
  • 设计模式
    设计模式1.修饰器模式2.模板设计模式......
  • 设计模式
    设计模式设计模式+反射+泛型+注解/配置文件等单例模式最简单,考的最多的一个设计模式要点(1)构造器私有化(2)在本类中创建这个唯一的实例分类//饿汉式/......
  • 前端设计模式——工厂模式
    前端中的工厂模式是一种创建对象的设计模式,它可以让我们封装创建对象的细节,我们使用工厂方法而不是直接调用new关键字来创建对象,使得代码更加清晰、简洁和易于维护。在前......
  • Jupyter notebook的使用
    Jupyternotebook的使用1.简介JupyterNotebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。——JupyterNoteb......
  • 计算机基础_设计模式
    熟练使用前端常用的设计模式编写代码如单例模式、装饰器模式、代理模式等 发布订阅模式和观察者模式的异同以及实际应用一、定性区别首先,观察者是经典软件设计模式中......