【发布时间】:2021-08-31 06:06:18
【问题描述】:
假设我在 Java 中有一个类层次结构:
interface Item { ... };
class MusicBox implements Item { ... };
class TypeWriter implements Item { ... };
class SoccerBall implements Item { ... };
我在同一个包中有另一个类:
class SpecialItemProcessor {
public void add(Item item)
{
/* X */
}
}
我想为每种项目类型做不同的事情,但我不想在不同的Item 类(MusicBox、TypeWriter、SoccerBall)中定义该操作。
一种处理方法是:
class SpecialItemProcessor {
public void add(Item item)
{
if (item instanceof MusicBox)
{
MusicBox musicbox = (MusicBox)item;
... do something ...
}
else if (item instanceof MusicBox)
{
TypeWriter typewriter = (TypeWriter)item;
... do something ...
}
else if (item instanceof SoccerBall)
{
SoccerBall soccerball = (SoccerBall)item;
... do something ...
}
else
{
... do something by default ...
}
}
}
这行得通,但看起来确实很笨重。 当我知道特殊情况时,有没有更好的方法来做到这一点?(显然,如果 Item 包含一个方法 doSomethingSpecial 那么我可以直接调用该项目的方法而不关心它是什么类型,但是如果我不希望在项目本身中出现这种差异,我该如何处理?)
【问题讨论】:
-
不是我知道的答案,但在 ActionScript 3 中,显然你可以从字符串实例化一个类(即;'com.djw.MusicBox' 可以实例化一个 MusicBox),这种事情可能在也许是Java?只是一个建议!
-
@dan:
Class#forName()。然而,我质疑这里的价值。
标签: java design-patterns dispatch