假设这个模型类:
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/