如何创建接口的实现,使用其他接口的特定实现?

时间:2013-04-02 17:05:20

标签: java design-patterns

我绝对无法解释我在标题中的含义。问题要么太愚蠢,要么太复杂,但最底层的是我找不到合适的设计模式。

所以,我们假设我们有一个包含对接口B的引用的类A.计算过程确定哪个B实现是合适的并实例化一个新对象。到目前为止一切都很好(我认为)。

现在B有一个基于一组参数的方法。对象A包含一组默认参数,但可以按需提供任何集合。棘手的部分是参数在接口B的实现之间完全不同。实际上,这些参数本身是不同的对象,它们有自己的方法,每个实现的B都不同。

我最初的方法是为参数创建一个接口C,然后为B的每个实现创建一个C实现(它是一对一的关系),但这似乎不对。如果不是其他任何东西,在B的每个独特实现中,我必须将C转换为调用其独特函数所需的相应实现。

人们只能假设有更漂亮的方式!有什么想法吗?

2 个答案:

答案 0 :(得分:5)

B不是一个合适的接口,如果用户需要使用依赖于底层实现的特定参数来调用其方法。你应该重新考虑你的设计。为什么A甚至可以访问这些参数?它们属于每个B实现吗?

答案 1 :(得分:2)

正如其他答案所指出的,B不是一个合适的界面(在道德意义上)。如果这些参数确实无法成为每个B实现的一部分,那么您仍然可以通过抽象细节来实现正确的接口:

interface BWrapper {
    public void doSomething();
}

class ConcreteB {
    public static class Params { ... }

    public class Wrapper implements BWrapper() {
        public Wrapper(Params params) { this.params = params; }
        @Override
        public void doSomething()     { ConcreteB.doSomething(params); }
        private final Params params;
    }

    public void doSomething(Params params) { ... }
}


class A {
    void setWrapper(BWrapper wrapper) { this.wrapper = wrapper; }
    void foo()                        { wrapper.doSomething(); }

    private BWrapper wrapper;
}

...

A a = new A();

ConcreteB.Params p1 = new ConcreteB.Params();
a.setWrapper(new ConcreteB.Wrapper(p1)); 
a.doSomething();

ConcreteB.Params p2 = new ConcreteB.Params();
a.setWrapper(new ConcreteB.Wrapper(p2)); 
a.doSomething();