这种界面设计会被认为是坏的吗?

时间:2017-05-28 13:23:15

标签: java design-patterns interface

我写了一个interface来存储数据List / Map,并且有能力将其检索回来。像这样:

public interface Repository {

    <K, V> void register(String typeTag, Key<K> key, V value);

    void unregister(String typeTag);
    void unregister(String... typeTags);
    void unregister(Collection<String> typeTags);

    <T> void add(String typeTag, T object);
    <T> void add(String typeTag, Collection<T> object);

    <T, K> T get(String typeTag, Key<K> key);
    <T, U, K> Map<T, U> getAsMap(String typeTag, Collection<Key<K>> keys);
    <T, U> Map<T, U> getAsMap(String typeTag);
    <T, K> List<T> getAsList(String typeTag, Collection<Key<K>> keys);
    <T> List<T> getAsList(String typeTag);
    <T, K> Map<String, T> get(Collection<String> typeTags, Collection<Key<K>> keys);

    <T> T remove(String typeTag, T object);

    void clear(String typeTag);
    void clear();

    <U, V> Map<U, V> map(String typeTag1, String typeTag2) throws IllegalMappingException;
    <U, V, K> Map<U, V> map(String typeTag1, String typeTag2, Collection<Key<K>> keys) throws IllegalMappingException;
    <U, V> Map<U, V> map(String typeTag1, Criteria<U> type1Criteria, String typeTag2, Criteria<V> type2Criteria) throws IllegalMappingException;
}

现在,我已经仔细考虑了这个界面的目的,并且可以通过以下方法进行定义:

register()unregister()add()get()remove()clear()map()

但是,正如您所看到的,这些方法的重载版本支持在Collection中获取和回馈数据。这些可以分类为&#34;方便&#34;方法(在我看来)。但它让我想知道实现者将不得不将这些方法作为强制实施,并且实现这些方法的人数太多了。我个人觉得设计过多地影响了界面和负担&#34;应该有所减少。

首先,

这个设计真的很糟糕吗?

在继续扩展层次结构之前,我应该考虑/应用并记住更改此设计的内容/策略。

修改

我只是在Java 7及更低版本中寻找解决方案。

1 个答案:

答案 0 :(得分:1)

这似乎是default接口方法的一个很好的用例。它们基本上允许您根据接口中的其他方法实现这些便捷方法。

例如,在add

的情况下
<T> void add(String typeTag, T object); // defined by user

default <T> void add(String typeTag, Collection<T> object) {
    for(T t : object) {
        add(typeTag, t);
    }
}

但是,如果用户想要实现默认方法(例如因为它们可以提供更优化的实现),那么 仍然可以覆盖default方法。

编辑:对于per-Java8,您可以创建一个实现便捷方法的abstract类,并将其作为扩展用户类的模板。虽然这是一个不太理想的解决方案,因为它强制用户扩展一个类,并且你只能扩展一个类。

abstract class AbstractRepository implements Repository {

    ...

    @Override
    public <T> void add(String typeTag, Collection<T> objects) {
        for(T t : objects) {
            add(typeTag, t);
        }
    }

    ...
}

...

class RepositoryImpl extends AbstractRepository {
    ...
}