Visitor Design Pattern Java

2025年5月5日 | 阅读7分钟

Java 中有 23 种设计模式,它们为应用程序设计中常见的问题提供了明确的解决方案。它代表了应用程序及其流程的详细描述。它是可以在许多不同情况下使用的问题的解决方案。通过提供经过验证的开发范例,它提高了开发过程的速度。在本节中,我们将重点关注 Java 中的访问者设计模式

访问者模式

它是一种行为设计模式。它管理对象之间的算法、关系和职责。它用于在运行时对一组相似的对象执行操作。它将操作与对象结构分离。使用访问者模式,我们可以在不更改现有代码的情况下轻松地向现有类层次结构添加新行为。有时,它也称为行为模式

这些设计模式提供了关于类对象通信的所有信息。这些是专门处理对象之间通信的模式。

因此,访问者模式的主要目标是将操作逻辑从对象移到另一个类。使用访问者模式,我们可以实现开闭原则。根据 GoF,访问者设计模式定义为:

表示要在对象结构元素上执行的操作。访问者允许您在不更改其操作的元素类的情况下定义新操作。

下图描述了访问者设计模式的概念。

Visitor Design Pattern Java

访问者模式实际上创建了一个使用其他类数据的外部类。当我们需要在各种不同的对象上执行操作时,可以使用此模式。它在不修改类的情况下为其提供附加功能。

访问者模式中使用了两个最重要的方法accept() 方法接受一个访问者。它由 Visitable 类提供。visit() 方法在每次访问元素时都会被调用。它由 Visitor 类实现。

访问者设计模式示例

访问者模式最常见的例子是在超市购物。在超市,我们挑选商品并将其添加到购物车中。当我们收集完所有必需的商品到购物车后,我们就去收银台结账。收银员检查我们挑选的所有商品,并告诉我们应付的总金额。这里,收银员充当访问者

何处以及何时使用它?

如果应用程序满足以下条件,则应使用访问者设计模式:

  • 如果有一组要访问的定义良好的类。
  • Said 类上的操作定义不明确或预先未知。例如,如果有人在使用您的 API,并且您希望让消费者有机会为对象添加新的临时功能。它们也是用临时功能扩展密封类的便捷方法。
  • 您对一类对象执行操作,并且希望避免运行时类型检查。当您遍历具有不同属性的各种不同对象的层次结构时,通常就是这种情况。

设计组件

访问者模式有五个主要组件:

  • 客户端 (Client):这是一个充当设计模式类消费者的类。它有权访问数据结构对象。它还指示它们接受执行适当处理的访问者。
  • 访问者 (Visitor):它可以是接口或抽象类。接口包含所有可访问类(visitable classes)的访问操作。
  • 具体访问者 (ConcreteVisitor):在抽象访问者中声明的所有访问方法都必须在 ConcreteVisitor 类中实现。每个访问者负责不同的操作。
  • 可访问 (Visitable):这也是一个接口,我们在其中声明 accept 操作。它是允许对象被访问者对象访问的入口点。
  • 具体可访问 (ConcreteVisitable):这是一个实现 Visitable 接口的类,或者是在其中定义 accept 操作的类。通过 accept 操作的对象传递访问者类的对象。

优点

  • 我们可以轻松地向系统中添加新项。更改只需要在 Visitor 接口中进行。其他现有代码将不受影响。
  • 如果操作的逻辑发生变化,则只需要在访问者实现中进行更改。
  • 它降低了维护成本。
  • 代码相对干净,易于阅读。
  • 类型安全,类型错误在编译时捕获。
  • 它提供了高扩展性。

缺点

  • 如果访问者接口有多个实现,则扩展起来很困难。
  • 在设计模式时,要强调 visit() 方法的返回类型。否则,我们将不得不更改接口及其所有实现。

Java 中访问者设计模式的实现

让我们为接受检查的车辆设计一个模式,检查员计算每辆车的服务费以及包括所有车辆在内的总服务费。

Visitor Design Pattern Java

在以下示例中,首先,我们将创建两个名为 VehicleVehicleInspector 的接口。

Vehicle.java

VehicleInspector.java

在这里,我们将创建五个名为 Car.java、Van.java、Moterbike.java、VehicleInspection.javaVehicleService.javaJava 类。Car、Van 和 Motorbike 类实现了 Vehicle 接口。这些是正在进行维护的车辆。

Car.java

Motherbike.java

Van.java

VehicleInspection.java

VehicleService.java

创建完所有接口和 Java 类后,项目目录将如下所示:

Visitor Design Pattern Java

输出

Service Charge for Car: 100
Service Charge for Van: 500
Service Charge for Motorbike: 50
Total Service Charge: 650

因此,使用访问者模式的目的是提供所有已实现的元素功能。如果我们想添加无限数量的复杂功能,就可以使用它。