我绝对无法解释我在标题中的含义。问题要么太愚蠢,要么太复杂,但最底层的是我找不到合适的设计模式。
所以,我们假设我们有一个包含对接口B的引用的类A.计算过程确定哪个B实现是合适的并实例化一个新对象。到目前为止一切都很好(我认为)。
现在B有一个基于一组参数的方法。对象A包含一组默认参数,但可以按需提供任何集合。棘手的部分是参数在接口B的实现之间完全不同。实际上,这些参数本身是不同的对象,它们有自己的方法,每个实现的B都不同。
我最初的方法是为参数创建一个接口C,然后为B的每个实现创建一个C实现(它是一对一的关系),但这似乎不对。如果不是其他任何东西,在B的每个独特实现中,我必须将C转换为调用其独特函数所需的相应实现。
人们只能假设有更漂亮的方式!有什么想法吗?
答案 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();