アダプター パターンは、主にクラスのインターフェイスを何に変換するために使用されます。ターゲット クラス形式では、ターゲット クラスとアダプター クラスを分離して、本来互換性のないクラスを連携させることができます。また、「開始と終了の原則」にも準拠しており、元のコードを変更せずに新しいアダプター クラスを追加できます。アダプター クラス内の特定の実装をカプセル化すると、クライアント クラスに対して透過的となり、アダプターの再利用性が向上しますが、アダプターを置き換える実装プロセスが比較的複雑になるという欠点があります。
したがって、アダプター モードは、次のシナリオに適しています:
(1) システムは既存のクラスを使用する必要があり、これらのクラスのインターフェイスは使用しません。システムインターフェースに準拠しています。
(2) サードパーティコンポーネントを使用する場合、コンポーネントのインターフェース定義が独自の定義と異なるため、独自のインターフェースを変更したくないが、関数を使用する必要があります。サードパーティコンポーネントインターフェイスの。
次の 2 つの非常に鮮明な例は、アダプター パターンが何であるかをよく示しています:
アダプター パターンは、主にクラス アダプター パターン、オブジェクト アダプター パターン、およびインターフェイス アダプター パターンの 3 つのカテゴリに分類されます。
1. クラス アダプター パターン:
##目標インターフェイス ( Target): 顧客が期待するインターフェイス。ターゲットは、具体クラス、抽象クラス、またはインターフェイスにすることができます。
- 適応する必要があるクラス (Adaptee): 適応する必要があるクラス、またはアダプター クラス。
- アダプター: 適応する必要があるオブジェクトをパッケージ化することにより、元のインターフェイスをターゲット インターフェイスに変換します。
// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 class Adaptee { public void specificRequest() { System.out.println("被适配类具有 特殊功能..."); } } // 目标接口,或称为标准接口 interface Target { public void request(); } // 具体目标类,只提供普通功能 class ConcreteTarget implements Target { public void request() { System.out.println("普通类 具有 普通功能..."); } } // 适配器类,继承了被适配类,同时实现标准接口 class Adapter extends Adaptee implements Target{ public void request() { super.specificRequest(); } } // 测试类public class Client { public static void main(String[] args) { // 使用普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); // 使用特殊功能类,即适配类 Target adapter = new Adapter(); adapter.request(); } }実行結果:
普通类 具有 普通功能... 被适配类具有 特殊功能...2. オブジェクト アダプター モード:
##
// 适配器类,直接关联被适配类,同时实现标准接口 class Adapter implements Target{ // 直接关联被适配类 private Adaptee adaptee; // 可以通过构造函数传入具体需要适配的被适配类对象 public Adapter (Adaptee adaptee) { this.adaptee = adaptee; } public void request() { // 这里是使用委托的方式完成特殊功能 this.adaptee.specificRequest(); } } // 测试类 public class Client { public static void main(String[] args) { // 使用普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); // 使用特殊功能类,即适配类, // 需要先创建一个被适配类的对象作为参数 Target adapter = new Adapter(new Adaptee()); adapter.request(); } }
テスト結果は上記と一致しています。クラス図から、変更する必要があるのはアダプター クラスの内部構造だけであることもわかります。つまり、アダプター自体が最初に適応されたクラスのオブジェクトを持ち、次に特定の特殊関数をこのオブジェクトに委任する必要があります。実装。オブジェクト アダプター モードを使用すると、Adapter クラス (適応クラス) は、受信した Adapte オブジェクトに基づいて複数の異なる適応クラスに適応できます。もちろん、この時点で、複数の適応クラスまたは抽象クラスのインターフェイスを抽出できます。オブジェクトアダプターのパターンがより柔軟になっているようです。
3. インターフェイスのアダプター モード:
作成するインターフェイスに複数の抽象メソッドが存在する場合があります。インターフェイスの実装クラスを作成する場合、それらは次のようにする必要があります。このインターフェースのすべてのメソッドは、すべてのメソッドが必要なわけではなく、一部だけが必要な場合もあるため、明らかに無駄になることがあります。この問題を解決するために、インターフェースのアダプター・モードを導入します。抽象クラス 、この抽象クラスはインターフェイスとすべてのメソッドを実装します。元のインターフェイスは扱わず、抽象クラスとのみ連絡するため、クラスを作成し、抽象クラスを継承し、必要なメソッドを書き直します。 。クラス図を見てください:
これは簡単に理解できますが、実際の開発では、このインターフェイスで定義されているメソッドが多すぎることがよくあります。一部の実装クラスでは必須です。コードを見てください:
public interface Sourceable { public void method1(); public void method2(); }抽象クラス Wrapper2:
public abstract class Wrapper2 implements Sourceable{ public void method1(){} public void method2(){} } public class SourceSub1 extends Wrapper2 { public void method1(){ System.out.println("the sourceable interface's first Sub1!"); } } public class SourceSub2 extends Wrapper2 { public void method1(){ System.out.println("the sourceable interface's second Sub2!"); } }
public class WrapperTest { public static void main(String[] args) { Sourceable source1 = new SourceSub1(); Sourceable source2 = new SourceSub2(); source1.method1(); source1.method2(); source2.method1(); source2.method2(); } }実行結果:
the sourceable interface's first Sub1! the sourceable interface's second Sub2!
以上がJava デザイン パターンの分析: アダプター パターンの実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。