Java 23のデザインパターン--Adapter(アダプタ)

3513 ワード

例のシーン:私达の以前のコンピュータの上でキーボードのusbインタフェースは円形があって、今もしこのインタフェースが壊れたら、ユーザーは1つを交换したいと思って、しかし市场の上で基本的に方形のusbインタフェースで、とても无頼で、番号をつけることができなくて、この时、店主はユーザーに心配しないで、1つのコンバータを买って、コンバータは円形と方形のインタフェースを互換することができて、问题は解决しました.このシーンでは、アダプタモードについて説明します.
Adapterモードの定義:1つのクラスのインタフェースをクライアントが期待する別のインタフェースに変換し、インタフェースが互換性がないため、これ以上一緒に仕事をできないクラスが一緒に仕事をすることができるようにする.
アダプタモード分類:1.クラスのアダプタモード(継承実装を採用)2.オブジェクトアダプタ(オブジェクト組合せで実現、委任)
パターンの構成:問題の例をモデルとする
ターゲット抽象ロール(Target):お客様が使用するインタフェースを定義し、キーボードをクライアントとし、クライアントが使用するusbインタフェースは円形であり、ここで円形インタフェースのデバイス(必ずしもキーボードではない)を抽象化することができます.
ソースロール(Adaptee):適切なインタフェースが必要です.ここでは、四角形usbインタフェースキーボードを指します.
アダプタロール(Adapter):ソースインタフェースを要件を満たすターゲットインタフェースに変換するためのデバイスです.ここでは、私たちの「コンバータ」を指します.
クライアント(Client):ここではそのキーボードを指します.
クラスアダプタモード:
ソース:
package cn.com.pattern; 
 
//      ,          usb   
public interface Target { 
    public void provideCircleUsb(); 
} 
package cn.com.pattern; 
//   ,         usb   
public class Adaptee { 
    public void provideSquareUsb(){ 
        System.out.println("      USB  "); 
    } 
} 
package cn.com.pattern; 
//    ,                
public class Adapter extends Adaptee implements Target{ 
    @Override 
    //                 
    public void provideCircleUsb() { 
        this.provideSquareUsb(); 
    } 
} 
package cn.com.pattern; 
 
//   ,          
public class Client { 
    public static void main(String[] args) { 
        Target target=new Adapter(); 
        //         USB   
        target.provideCircleUsb(); 
    } 
} 

最後に出力されます.
私は方形のUSBインタフェースを提供します
ユーザーが必要とする効果を達成し、円形USBインタフェースのみをサポートするキーボードに正方形USBインタフェースを使用させる
以上がクラスのアダプタモードであり、オブジェクトのアダプタモードの違いは、クラスのアダプタモードが継承する方法ではなく、AdapterロールがAdapteeロールをカプセル化していることです.その原理は基本的に似ている.
オブジェクトアダプタモード:(優先)
public class Adapter implements Target{ 
       private Adaptee adptee; 
       public Adapter(Adaptee adptee){ 
          this.adptee=adptee; 
          } 
          
        @Override 
    //                 
    public void provideCircleUsb() { 
        adptee.provideSquareUsb(); 
    } 
} 
//   ,          
public class UClient {
	 public static void main(String[] args) { 
		Adaptee adaptee=new Adaptee();
	        Target target=new Adapter(adaptee); 
	        //         USB   
	        target.provideCircleUsb(); 
	    } 
}

クラスのアダプタモードとオブジェクトアダプタモードの比較:
1.クラスの適合モードは単一ソースの適合に用いられ、そのソースの単一話のため、コード実現は選択論理を書く必要がなく、はっきりしている.オブジェクトのアダプティブモードはマルチソースのアダプティブに使用でき、クラスアダプティブモードの不足を補い、もともとクラスアダプターを多く書く必要があった場合は存在しない.弱点は、ソースの数が多いため、具体的な実現条件は分岐比が多く、はっきりしないことだ.
アダプタモードを適用するシーン:
1.システムは既存のクラスを使用する必要があるが、既存のクラスは現在のシステムの要求に合わない.問題の提起のように.
2.システムは、相互にあまり関連のないクラスまたは将来参照するクラスと一緒に作業するために、繰り返し使用可能なクラスを確立します.Junitではアダプタモードを使うシーンがあります.
デフォルトのアダプタ・モード(Default Adapter):デフォルトのアダプタ・モードは、既存のインタフェースを拡張することなく、このデフォルトの実装クラスからサブクラスを拡張するデフォルトの実装を提供します.Swingの勉強で「AWTでのイベントの処理」に触れていると思います.彼のメリットは、クライアントが彼とは関係のない方法を実現する必要がなく、彼の最も関心のあることだけをすることです.
このモードの核心は、インタフェースを実装したいが、すべてのインタフェースメソッドを実装したくない場合、一部のメソッドを実装したい場合は、デフォルトのアダプタモードを使用します.彼の方法は、インタフェースと具体的な実装クラスに抽象クラスを追加し、抽象クラスでターゲットインタフェースを実装するすべてのメソッドを空にすることです.具体的な実装クラスは、完了する必要があるメソッドを上書きするだけでよい.変換元:
http://blog.csdn.net/leoleocmm/article/details/7593886