假设我有一个空接口Fruit,具有不同的Java实现,如Apple、Mango、Orange等。
我有一个FruitBasket,它有所有种类水果的setter,即
basket.setApple(Apple a);
basket.setOrange(Orange o);
等等。
现在,当我需要为篮子设置特定的水果时,我需要调用正确的setter。一种做法是拥有一个实用程序服务,它将迭代所有模型对象(水果)并在篮子上调用相应的setter。
类似这样。
public class FruitUtilty
{
public static void setAllFruits(FruitBasket basket, List<Fruits> fruits)
{
for(Fruit fruit : fruits)
{
if(fruit.getClass() == Apple.class)
{
basket.setApple((Apple)fruit);
}
else if(fruit.getClass() == Mango.class)
{
basket.setMango((Mango)fruit);
}
else if(fruit.getClass() == Orange.class)
{
basket.setOrange((Orange)fruit);
}
}
}
}
但我看到的问题是一个丑陋的if/else条件语句。每次我们添加一个模型对象,这个实用程序都必须被修改。
因此,我提出了一种设计,在这种设计中,接口不会是空的,而是有一个“setBasket”行为供所有水果实现。
public interface Fruit
{
public void setBasket(FruitBasket b);
}
现在所有水果(它们应该是简单的模型对象)都以这种方式实现此接口。例如,苹果会像这样:
public class Apple implements Fruit {
....
....
....
public void setBasket(FruitBasket b) {
b.setApple(this);
}
}
现在我们不再需要 FruitUtility 类,无论何时调用 FruitUtility 的 setAllFruits,我们都可以简单地使用以下代码片段。
FruitBasket f = new FruitBasket();
List<Fruit> fruits = getAllFruits();
for(Fruit fruit: fruits)
{
fruit.setBasket(f);
}
........
........
我的团队领导说这是一个非常糟糕的设计,因为我已经“稀释”了模型对象。我们的模型只应该是一个“哑”对象,只能携带数据。所以我们应该坚持使用基于实用程序的方法或其他任何方法而不是这种方法。
在JAVA中做事情的正确/最佳方式是什么?
提前感谢。
FruitBasket
的代码会让这个问题更清晰,至少对我来说是这样。 - Don Roby