java-为模型设计实现行为(接口)是否不好?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-为模型设计实现行为(接口)是否不好?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3344字,纯文字阅读大概需要5分钟。
内容图文
抱歉,如果我的问题确实不重要.但是我不认为我擅长“设计”,所以想对该主题有所了解
假设我的水果接口为空,具有不同的Java实现,例如Apple,Mango,Orange等.
我有一个水果篮,可以塞满各种水果,即
basket.setApple(Apple a);
basket.setOrange(Orange o);
等等.
现在,当我需要为篮子设置特定的水果时,我需要调用正确的二传手.一种实现方法是拥有一个Utility服务,该服务将遍历所有te模型对象(水果)并在购物篮上调用相应的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中)?
提前致谢.
解决方法:
我认为在这种情况下,水果应该是“哑巴”.今天,您将它们添加到购物篮中,明天,您将在商店中出售它们;一周后,您将它们混合成沙拉:)
如果将一个“ setBasket”方法添加到Fruits接口,则这两个概念在接口级别耦合在一起,这是不好的.
另一方面,如您所说的那样,它是否不可扩展.
我认为最好的方法(至少这是我要解决的方法)是引入另一个抽象,例如“动作”,它表示可以对水果执行的动作.
如果我们谈论的是篮子,我想您可以创建一个通用接口并为每种水果实现它.
例:
public interface FruitBasketAdder {
void addFruit(Fruit fruit, Basket basket);
}
public class AppleBasketAdder implements FruitBasketAdder {
public void addFruit(Fruit fruit, Basket basket) {
Apple apple = (Apple) fruit;
basket.addApple(apple);
....
}
}
public class OrangeBasketAdder implements FruitBasketAdder {
public void addFruit(Fruit fruit, Basket) {
Orange orange = (Orange) fruit;
basket.addOrange(orange);
....
}
}
现在,您可以生成一个注册表,该注册表表示可以处理各种水果的策略.像这样:
Map<Class<Fruit>>, FruitBasketAdder> registry = new HashMap<>();
registry.put(Orange.class, new OrangeBasketAdder());
registry.put(Apple.class, new AppleBasketAdder());
.....
最后一点是使用此注册表.假设您有一个通用方法,该方法接受“水果”列表作为参数,然后尝试将其添加到购物篮中,就像您在示例中用“ if”说明的那样.因此,您应该从注册表中找到一个分配的“ BasketAdder”(假定您具有对可访问注册表的引用),并通过调用相关的BasketAdder将水果添加到购物篮中.干得好:
public void addFruitsToTheBasket(List<Fruit> fruits, Basket basket) {
for(Fruit fruit : fruits) {
BasketAdder adder = registry.get(fruit.getClass());
adder.addFruit(fruit, basket);
}
}
这种设计比“ if”要好得多,因为它允许动态添加新种类的水果而不会破坏接口.
只需创建一个BasketAdder,将其传递给注册表即可,完成后,主要算法(遍历添加到购物篮中)将保持不变.
标记
希望这可以帮助
内容总结
以上是互联网集市为您收集整理的java-为模型设计实现行为(接口)是否不好?全部内容,希望文章能够帮你解决java-为模型设计实现行为(接口)是否不好?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。