【问题标题】:Design pattern for switching based on instance of without using instance of keyword基于instance of而不使用instance of关键字的切换设计模式
【发布时间】:2018-04-11 00:45:54
【问题描述】:

我面临一个设计挑战,我必须根据对象的实例进行切换。有人告诉我,在 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 等。这些方法正在执行完全不相关的操作。请帮我确定这个问题的正确设计模式。

【问题讨论】:

  • 我不明白访问者模式的问题。
  • 您能否编辑您的问题,让我们举例说明处理程序对每种车辆类型的作用?这可能有助于我们决定什么是合适的,例如。你能有Vehicle::handle()
  • 您不想使用访问者模式,也不想使用instanceof。还有什么你不想用的吗?为什么不使用这些选项?
  • 要打开一个对象的实例,你在超类中创建一个方法并在子类中以不同的方式实现它。这是最基本的OO概念。它仅适用于“一个对象实例”,而不适用于两个,但根据您的要求没问题。
  • 困扰我的是它可能是特定于某些场景的业务逻辑。为什么它应该成为 Vehicle 接口的一部分?假设我正在提供车辆类,而第三方正在开发其他东西,为什么它们的特定逻辑应该在车辆内部?

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


【解决方案1】:

使用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 界面的原因吗?

【讨论】:

    猜你喜欢
    • 2022-12-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2021-04-14
    • 2021-12-15
    • 2017-08-14
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多