我需要一个设计模式来将参数传递给子类,但是参数不同。
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 是解决这个问题的最佳方法?