我有一个基于接口的现有设计,它暴露了一个API方法,该方法当前返回void。并且有许多不同的实现类来实现此接口。但是,现在我想进行更改,以便这些实现中的少数应该返回一个Object。显而易见的解决方案似乎是:使所有实现返回'Object'并期望在不需要的地方忽略返回的值。但对于这样的重新分解,是否有更清洁,更好的解决方案?
是否有任何设计模式可以在这里应用,这将使设计更好,以防我必须对所有现有的实现进行更改,无论是否需要。
下图:
//the interface
public interface CommonInterface{
public void commonMethod(); //this is where I want to change the return type
//to 'Object' for some of the implementations
}
//the factory
public CommonInterface getImplInstance() {
CommonInterface implInstance = instance; //logic to return corresponding instance
return implInstance;
}
//the implementation (there are multiple implemenations like this)
public class Impl1 implements CommonInterface {
public void commonMethod() {
//some logic
}
}
答案 0 :(得分:2)
一个选项是创建一个新接口CommonInterface2,它实现了新方法。这需要更改“少数这些实现”而不是“许多实现类”。
public interface CommonInterface2 extends CommonInterface {
public Object commonMethodAndReturn();
}
仅在返回对象的实现子集中实现它。
public class OneOfTheFew implements CommonInterface2 { ... }
public class OneOfTheMany implements CommonInterface { ... }
仅在需要返回值的情况下测试新接口。
public void foo( CommonInterface ci ) {
if ( ci instanceof CommonInterface2 ) {
CommonInterface2 ci2 = (CommonInterface2) ci;
...
}
}