1

我绝对无法解释我在标题中的意思。这个问题要么太愚蠢,要么太复杂,但归根结底是我找不到合适的设计模式。

因此,让我们假设我们有一个类 A,其中包含对接口 B 的引用。计算过程确定 B 的哪个实现是合适的并实例化一个新对象。到目前为止一切顺利(我认为)。

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

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

只能假设有更漂亮的方法!有任何想法吗?

4

2 回答 2

5

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

于 2013-04-02T17:18:43.063 回答
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();
于 2013-04-02T17:16:52.013 回答