Javaデザインモード----アダプタモード


1.アダプタモードの概要
アダプタ・モード(Adapter):クラスのインタフェースをお客様が望む別のインタフェースに変換します.Adapterモードでは、インタフェースが互換性がないため、一緒に作業できないクラスが一緒に作業できます.
適用シーン:1、すでに存在するクラスのインタフェースは私たちのニーズに合わない;
2、多重化可能なクラスを作成し、そのクラスが他の関連しないクラスまたは予見できないクラス(すなわち、インタフェースが必ずしも互換性がないクラス)と協働して動作できるようにする.
3.それぞれのインタフェースに一致するようにサブクラス化しない場合、既存のサブクラスを使用します.
その実現方法は主に2種類ある.
     1.クラスのアダプタモード(継承による実装)
     2.オブジェクトアダプタ(オブジェクトの組み合わせで実現)
2.クラスアダプタ
私たちの生活の中でよく耳にするのは電源アダプタで、電流変換(整流)のための装置です.アダプタの存在は、既存のもの(インタフェース)を私たちのニーズに合ったものに変換し、利用できるようにするためです.現実の生活では、アダプタは中間層としてこのような変換作用を実現することが多いです.
ここで、•Target:Clientが使用する特定のレルムに関連するインタフェースを定義します.•Client:ターゲットインタフェースに準拠するオブジェクトと連携します.•Adaptee-適切なインタフェースが必要な既存のインタフェースを定義します.•Adapter:AdapteeのインタフェースをTargetインタフェースに適合
上記の汎用クラス図では、Cientクラスは最終的にターゲット基準を満たすサブクラスのみを使用できるTargetインタフェース(または抽象クラス)に直面します.Adapteeクラスはspecificを含むため、適切なオブジェクト(ソースロールとも呼ばれます)です.(特殊な)操作、機能など、自分のシステムで使用したいので、Clientクラスが透明な場合にConcreteTargetクラスや特殊な機能を持つAdateeクラスを任意に選択できるように、私たちの基準に合致するクラスに変換します.
コードは次のように実装されます.
//     、      、               
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();
	}
}
テスト結果:
通常クラスには通常の機能があります...
アダプティブクラスには特殊な機能があります...
上記の実装のアダプタはクラスアダプタと呼ばれ、AdapterクラスはAdaptee(適合クラス)を継承し、Targetインタフェースも実現しているため(Javaはマルチ継承をサポートしていないため、このように実装される)、Clientクラスでは必要に応じて任意のニーズに合ったサブクラスを選択して作成し、具体的な機能を実現することができる.
3.オブジェクトアダプタ
もう1つのアダプタモードは、オブジェクトアダプタです.マルチ継承または継承を使用して再実装するのではなく、直接関連付けまたは委任と呼ばれる方法を使用します.クラス図は次のとおりです.
コードは次のように実装されます.
//     ,        ,        
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クラスの内部構造にすぎないことを知っています.すなわち、Adapter自身はまず適切なクラスのオブジェクトを持ってから、具体的な特殊な機能をこのオブジェクトに委託して実現しなければなりません.オブジェクトアダプタモードを使用すると、アダプタークラス(アダプタークラス)が受信したアダプターオブジェクトに基づいて複数の異なるアダプタークラスをアダプター化する機能を実現できます.もちろん、この場合、複数のアダプタークラスに対して1つのインタフェースまたは抽象クラスを抽出することができます.これにより、オブジェクトアダプタモードがより柔軟になります.
4.まとめ
1、アダプターモードも包装モードであり、以前のDecorator装飾モードと同様に包装機能を有する.また、対象アダプターモードには明示的な依頼の意味も含まれていますが(実はクラスアダプターもそうですが、隠しているだけです)、Proxyエージェントモードにも似ていると思います.2、上記の点を比較すると、Decorator、Proxy、Adapterは自分の最も主要な目的を実現しています(これは各モードの最初の動機、説明を見なければならない)以外に、包装の前後で追加の、特殊な機能の増減を行うことができて、私はそれらがすべて委託の実現の意味があると思っています;3、私が読んだ本の中でアダプタモードが詳細な設計の段階でそれを使用するのに適していないと言って、それは補償モードで、システムの後期に拡張するために専用です、修正時に使用します.