Zunächst müssen Sie eine Möglichkeit finden, die Adapter (A' 1 .. A' n ) mit den konkreten Instanzen (A 1 .. A n ). Dies geschieht am besten mit einer Map<Class<?>, Constructor<?>>
. Eine gute Möglichkeit wäre, eine Registrierung zu erstellen:
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;
}
}
Dann muss man nur noch die Adapter erstellen:
public class Adapter implements Y {
private Y innerY;
public Adapter(Y innerY) {
this.innerY = innerY;
}
// Implement Y
}
Und registrieren Sie Ihre(n) Adapter:
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);
Beachten Sie, dass Sie auf diese Weise mehrere Adapter für dieselbe Klasse registrieren können, wenn Sie möchten. Wenn eine Teilmenge konkreter Klassen auf die gleiche Weise behandelt werden soll, müssen Sie nur denselben Adapter für alle registrieren.
Als Nächstes holen Sie den Wrapper:
for (Y y : yList) {
Y adapter = AdapterRegistry.wrap(y);
// Do something with the adapter
}
Dies ist mit gewissen Einschränkungen verbunden:
- Sie müssen einen Konstruktor in jedem Adapter haben, der das konkrete Objekt durch seine Schnittstelle .
- Die Schnittstelle muss die Methoden enthalten, die Sie ändern möchten (wenn Sie
Y
als Typ für innerY
Sie können dies ändern, so dass Sie Zugriff auf Nicht-Schnittstellen-Methoden haben, aber dann müssen Sie Casting durchführen).
Sie können dann auch Ihre AdapterRegistry
auch in anderen Teilen Ihres Programms, da es Generika verwendet.
Sagen Sie mir Bescheid, wenn es Probleme mit dem Code gibt und Sie ihn nicht lösen können.