java - 访问者模式可以包含一些状态吗?

标签 java design-patterns visitor-pattern

假设这个模型类:

public class Car extends Vehicle implements Visitable {
  .....
  void accept(VehicleVisitor visitor){
    visitor.visit(this);
  }  
  .....
}

使用 visitor 是因为允许授予某些车辆的决定是在很晚的时候做出的(在创建 Car 类之后)。

Visitor 的特定层次结构具有继承自 CarVisitor 的名为 VehicleEvaluatorVisitor 的基类,其目标是通知车辆是否值得奖励:

public class VehicleEvaluatorVisitor implements VehicleVisitor {

  boolean mustBeAwarded;

  public visit(Car car){
    ....
    mustBeAwarded= true;   //after some conditional
  }

  .... //other visit methods

  boolean mustVehicleBeAwarded(){
    return mustBeAwarded;
  }

}

此设计的目标是允许客户端迭代任何 Vehicle 集合,以了解必须授予哪辆车:

  ...
    VehicleEvaluatorVisitor visitor = new VehicleEvaluatorVisitor ();
    for(Vehicle vehicle : vehicules){
      vehicle.accept(visitor);
      boolean mustToBeAwarded = visitor.mustVehicleBeAwarded();
      .....
  ...

我的问题是:这是一个可以接受的设计吗? (当然,Car and award concept只是一个理论例子)

最佳答案

可以为访问者设置状态。

但在大多数情况下,它过于复杂。

考虑让访问者使用通用代码,您的代码将变成:

访客界面

public interface VehicleVisitor<T> {
    ...
    T visit(Car car);
    ...
}

有车类

public class Car extends Vehicle implements Visitable {
    ...
    <T> T accept(VehicleVisitor<T> visitor){
        return visitor.visit(this);
    }
    ...
}

和访问者实现

public class VehicleEvaluatorVisitor implements VehicleVisitor<Boolean> {

    public Boolean visit(Car car){
        ...
        return true;
        ...
    }

}

关于java - 访问者模式可以包含一些状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9227059/

相关文章:

c++ - 什么是单次 dispatch 和双重 dispatch ?

c# - 在 C# 中引用的 Mono.Cecil 中的以下构造是什么?

c++ - 使用 lambda 进行变体访问的最佳方法

java - jsp session 中的类型转换错误

java - 安装7BEE(java构建工具)

java - IntelliJ IDEA 2017.3 无法解决@ParameterizedTest

Java库架构

java - 按键事件不起作用 - java

c++ - 将 NSNotificationCenter 设计模式移动到 C++ 进行移植?

java - 乐观缓存并发设计模式