设计模式:传递/设置未知类的变量

时间:2012-07-04 19:46:19

标签: design-patterns inheritance methods

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

1)无限制的实例检查:问题: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:与上面相同而不是(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,它是我们的garbase处理箱。

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是解决这个问题的最佳方法吗?

1 个答案:

答案 0 :(得分:1)

垃圾邮件instanceof的已知替代品之一是访客模式 - 请点击此处:http://www.refactoring.com/catalog/replaceConditionalWithVisitor.html

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