まず、アダプター(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
ジェネリックスを使用しているため、プログラムの他の部分でも使用できます。
コードに問題があり、理解できない場合はお知らせください。