我需要一个设计模式来将参数传递给子类,但参数不同。
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是解决这个问题的最佳方法吗?
答案 0 :(得分:1)
垃圾邮件instanceof
的已知替代品之一是访客模式 - 请点击此处:http://www.refactoring.com/catalog/replaceConditionalWithVisitor.html
您还可以阅读此问题Avoiding instanceof in Java