1

我需要一个设计模式来将参数传递给子类,但是参数不同。

1)无限的instanceof检查:问题:a)慢b)不可读。

Component a ;
if ( a instanceof SimpleComponent)
{
   (SimpleComponent)a.do();
}
else if ( a instanceof UnitComponent)
{
   (UnitComponent)a.do( unit );
}
else if ( a instanceof BuildingComponent)
{
   (BuildingComponent)a.do( building );
}

1a)使用 Setter:与上面相同,而不是 do(X),调用 set(X),需要无限制的 instanceof 检查。

2)巨大的switch语句:问题:a)我们仍然需要转换实例。b) 不可读。

3)在构造函数上传递变量:问题:在应用程序的生命周期内无法再次更改该变量,这将需要调用特定的未知 .set(X) 方法。

4)将所有未关联的变量放入超类:

   Component
   {
     Unit unit;
     Building building;
     String i_can_pass_strings_0;
     String i_can_pass_strings_1;
     String i_can_pass_strings_2;
     int    i_am_allowed_to_pass_a_single_int_now;
   }

这就像使用全局变量在函数之间传递变量一样。您将以具有 200-300 个不相关变量的类结束,垃圾收集问题。此外,您甚至必须想一想,该课程以一个不可读的大垃圾箱结束。

5)上面的Component类重命名为ComponentOptions(它仍然是一个垃圾箱)。

interface Component
{
   do ( ComponentOptions );
}

解决方案:至少现在我不必考虑如何调用 do(); 它被称为相同的方式。

问题:a) 不是调用者决定要传递哪些变量,而是接收者子类必须决定如何读取变量。在这种情况下,我们使用 ComponentOptions 这是我们的垃圾处理箱。

6)组件模式:拥有/获取组件。

class UnitComponent implement Component
{
   public void do( ComponentOptions componentOptions )
   {
      if ( hasComponent( Unit.class )
      {
         Unit unit = componentOptions.getComponent( Unit.class );
         doStuff( unit ) ;
      }
   }
}

a) 可读

问题:1)是否有另一种设计模式来解决这个问题,或者解决方案 6 是解决这个问题的最佳方法?

4

1 回答 1

1

垃圾邮件的已知替代品之一instanceof是访客模式 - 看看这里:http ://www.refactoring.com/catalog/replaceConditionalWithVisitor.html

您还可以阅读此问题Avoiding instanceof in Java

于 2012-07-04T19:53:01.947 回答