基于实例切换的设计模式,不使用关键字实例

时间:2017-10-30 05:11:23

标签: java oop design-patterns instanceof visitor-pattern

我面临设计挑战,我必须根据对象的实例进行切换。我被告知在Java中使用instanceof运算符是个坏主意。有人建议访问者模式,但在场景中,我面临切换必须基于一个对象实例而不是两个。所以我觉得使用访问者模式可能有点过分,这种访问模式非常具体而且令人困惑。请建议正确的方法。以下是一个示例

VehicleHandler ( Vehicle vehicle){



if( vehicle instanceof Car)


// Do something which cant be tied to Car's impl ( Dont want busiess logic to be in the class itself

else if(vehicle instanceof Bike)
// Do something  
}

CarBike实现了标记接口Vehicle。 有许多类具有将车辆作为参数的功能,并且需要在每个类中分叉,例如VehicleTransformerVehicleValidator等。这些方法正在执行完全不相关的操作。请帮我确定这个问题的正确设计模式。

1 个答案:

答案 0 :(得分:0)

使用instanceof本身不是bad。 但是,它通常意味着关于类/接口设计的某些内容已经关闭。

如果您有一组有限的非开放式课程,则访客模式是合适的。

不要使用标记界面,而应考虑添加 void accept(VehicleVisitor vv);

将它实现到一个公共抽象基类中(如果可以的话)或者在Car and Bike中实现它,如下所示:

void accept(VehicleVisitor vv) {
  vv.visit(this);
}

使用类或接口

class VehicleVisitor {
   void visit(Car car) {
      // do car stuff here
   }
   void visit(Bike b) {
      // do bike stuff here
   }
}

然后在处理代码中使用它:

Vehicle v = ....;
VehicleVisitor vv = new VehicleVisitor();
v.accept(vv);

还有一个原因是您无法将validatetransform添加到Vehicle界面吗?