OOP:在这种情况下,扩展/实现如何帮助我

时间:2014-05-03 12:51:25

标签: java oop

我正在制作仓库系统(使用OOP),当然还有很多商品。我希望有一个ArrayList(或其他一些容器)来存放这些货物,所以当货物从灯具变为杯子(货物的子类)时,我可以更换更少的代码。似乎可以通过扩展/实现类商品来实现。但是当我得到用户的输入时,如果我有很多子类,似乎我必须使用很多if-else。

像这样:

    if(name == Light){list.add(new Light(...)}
    if(name == Cup){list.add(new Cup(...)}
    ...

当我从列表中获取货物时,似乎我必须使用instanceof

像这样:

    if(goods instanceof Light){}
    if(goods instanceof Cup) {}
    ...

所以代码变得不那么优雅了。 所以我的问题是如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

评论中的问题肯定是合理的:当您将商品存储为商品时,在哪个时间点(以及为什么)与类型这些元素相关?

当然,人们可以想象这些信息是必要的。但是,当这是使用这些类的主要方式时,应该考虑使用不同的结构。例如,然后可以考虑类似

的东西
Map<Class<?>, List<?>> mapFromClassToListOfObjectsWithThisClass;

可以在内部维护(以类型安全的方式) - 但这只是第一个粗略的想法。

无论如何,你应该避免许多instanceof条款。特别是当意图以后用其他类型扩展该系统时。当某些客户端引入新的Good子类型时,您当然不希望被迫重新编译代码。

然后,您可以考虑使用一种方法,该方法允许从给定列表中提取特定类型的对象:

import java.util.ArrayList;
import java.util.List;

public class TypeListFilterTest
{
    public static void main(String[] args)
    {
        List<Number> list = new ArrayList<Number>();

        list.add(Integer.valueOf(12));
        list.add(Double.valueOf(12.34));
        list.add(Float.valueOf(23.45f));
        list.add(Integer.valueOf(34));
        list.add(Float.valueOf(34.56f));

        List<Float> floats = filter(list, Float.class);
        System.out.println("Floats  : "+floats);

        List<Integer> integers = filter(list, Integer.class);
        System.out.println("Integers: "+integers);
    }

    private static <T> List<T> filter(Iterable<?> list, Class<T> t)
    {
        List<T> result = new ArrayList<T>();
        for (Object object : list)
        {
            if (t.isInstance(object))
            {
                result.add(t.cast(object));
            }
        }
        return result;
    }
}

在最好的情况下,此方法可以替换instanceof测试,并允许处理不同类型,将这些类型的感知责任留给客户端代码。这样,类可以处理新类型,而无需使用新的instanceof检查进行重新编译。

但根据目前的问题描述,这也只是第一个想法,可能适用于您的情况,也可能不适用。

答案 1 :(得分:1)

作为OO的事情:不要编程看你有什么对象,只需使用它们。 当你调用一个对象时,不要告诉他们该做什么,他们应该自己知道这个方法。

在以下演示中,CupLight是一种商品,您可以拥有更多种类的商品 当你使用它们时,告诉他们做这个工作,我的意思是调用方法saySomething()。
在这种情况下不需要if-else

public class Test {

public interface Goods {
    public void whoAmI();
}

public static class Light implements Goods {
    @Override
    public void whoAmI() {
        System.out.println("I'm a Light");
    }
}

public static class Cup implements Goods {
    @Override
    public void whoAmI() {
        System.out.println("I'm a Cup");
    }
}

public static class CupLight extends Light {
    public void saySomething() {
        whoAmI();
    }
}

public static void main(String[] args) {
    new CupLight().saySomething();
}

}

答案 2 :(得分:0)

我建议你用“责任链”模式交换你的“if-else”陈述。

Chain of responisibility on wikipedia

享受:)

相关问题