首先,您需要一种将适配器 (A' 1 .. A' n ) 与具体实例 (A 1 .. A n ) 相关联的方法。最好使用Map<Class<?>, Constructor<?>>
. 一个好方法是围绕它编写一个注册表:
public class AdapterRegistry {
private static final Map<Class<?>, Constructor<?>> adapterMap =
new HashMap<Class<?>, Constructor<?>>();
public static void register(Class<?> interfaceClass, Class<?> concreteClass, Class<?> adapterClass)
throws NoSuchMethodException {
// Check for the constructor
Constructor<?> constructor = adapterClass.getConstructor(interfaceClass);
adapterMap.put(concreteClass, constructor);
}
public static <T, V extends T> T wrap(V v) {
Class<?> concreteClass = v.getClass();
try {
Constructor<?> constructor = adapterMap.get(concreteClass);
if (constructor != null) {
return (T) constructor.newInstance(v);
}
} catch (Exception ex) {
// TODO Log me
}
return null;
}
}
然后只需创建适配器即可:
public class Adapter implements Y {
private Y innerY;
public Adapter(Y innerY) {
this.innerY = innerY;
}
// Implement Y
}
并注册您的适配器:
AdapterRegistry.register(Y.class, A1.class, Adapter1.class);
AdapterRegistry.register(Y.class, A2.class, Adapter1.class);
AdapterRegistry.register(Y.class, A3.class, Adapter2.class);
// ...
AdapterRegistry.register(An.class, AdapterM.class);
请注意,如果您愿意,可以像这样为同一个类注册多个适配器。这样,如果以相同方式处理具体类的子集,您只需为所有这些类注册相同的适配器。
接下来,获取包装器:
for (Y y : yList) {
Y adapter = AdapterRegistry.wrap(y);
// Do something with the adapter
}
这有一定的限制:
- 您必须在每个适配器中都有一个构造函数,该构造函数通过其接口获取具体对象。
- 接口必须具有您要更改的方法(如果您将
Y
其用作 的类型innerY
,则可以更改它以便可以访问非接口方法,但是您必须进行强制转换)。
AdapterRegistry
由于使用了泛型,因此您也可以在程序的其他部分使用您的。
让我知道代码是否有任何问题,而您无法弄清楚。