キーポイント:
1. アダプター パターンは主に「既存のクラスを再利用したいが、インターフェースが再利用環境の要件と一致しない」場合に使用され、レガシー コードの再利用やクラス ライブラリの移行などに非常に役立ちます。
2. アダプタパターンにはオブジェクトアダプタとクラスアダプタの2つの実装構造がありますが、クラスアダプタは「多重継承」実装方式を採用しており、望ましくない高結合をもたらすため、一般的には推奨されません。オブジェクト アダプタは、より疎結合の精神に沿った「オブジェクト結合」方式を採用しています。
実装:
クラスアダプタのパターン構造図(継承)
オブジェクトのアダプターパターン構造図(構成)
(オブジェクトアダプターのコード実装)
ターゲット: 特定のフィールドに関連してクライアントが使用するインターフェースを定義します
<span>public</span> <span>interface</span> Target { <span>void</span> request();}
適応者: 今すぐ適応する必要がある既存のインターフェース
<span>public</span> <span>class</span> Adaptee{ <span>public</span> <span>void</span> specificRequest(){}}
アダプター: Adaptee インターフェースと Target インターフェースを適応させます
<span>public</span> <span>class</span> Adapter <span>implements</span> Target{ <span>public</span> Adapter(Adaptee adaptee) { <span>super</span>(); <span>this</span>.adaptee = adaptee; } <span>public</span> <span>void</span> request() { adaptee.specificRequest(); } <span>private</span> Adaptee adaptee;}
適用範囲:
1. システムは既存のクラスを使用する必要がありますが、このクラスのインターフェイスはシステムのニーズを満たしていません。
2. 将来導入される可能性のあるクラスなど、相互に密接に関連していない一部のクラスを操作するために使用できる再利用可能なクラスを作成したい。これらのソース クラスには、必ずしも複雑なインターフェイスがあるわけではありません。
3. (オブジェクトアダプターの場合) クラスアダプターパターンを使用する場合、設計上、複数の既存のサブクラスのインターフェースを変更する必要があり、サブクラスごとにアダプターを作成する必要があります。
効果、メリット、デメリット:
クラスアダプターの場合:
1. 特定のアダプター クラスを使用して、Adapte と Target を一致させます。その結果、クラスとそのすべてのサブクラスを一致させたい場合、クラスのアダプターはその仕事を実行できません。
2. アダプターは Adaptee のサブクラスであるため、アダプターが Adaptee の一部の動作をオーバーライド (再定義) できるようにします。
オブジェクトアダプターの場合:
1. アダプターが複数の Adapte 、つまり、Adaptee 自体とそのすべてのサブクラス (サブクラスがある場合) を同時に操作できるようにします。アダプターは、すべての Adapte に一度に機能を追加することもできます。
2. Adaptee の動作をオーバーライド (再定義) することが困難になります。 Adaptee メソッドをオーバーライドする必要がある場合は、まず Adaptee メソッドをオーバーライドするための Adaptee のサブクラスを作成し、次にこのサブクラスを適応用の実際の Adaptee ソースとして使用する必要があります。