我面临设计挑战,我必须根据对象的实例进行切换。我被告知在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
}
Car
和Bike
实现了标记接口Vehicle
。
有许多类具有将车辆作为参数的功能,并且需要在每个类中分叉,例如VehicleTransformer
,VehicleValidator
等。这些方法正在执行完全不相关的操作。请帮我确定这个问题的正确设计模式。
答案 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);
还有一个原因是您无法将validate
和transform
添加到Vehicle界面吗?