設計モード10——Adapter設計モード


Adapterアダプタモードは、2つの互換性のないクラスを組み合わせて使用します.生活の中でノートパソコンや携帯電話などのデジタル製品の充電器はアダプタで、家庭用220 Vの交流電力をノートパソコンや携帯電話の正常な動作に必要な目標電圧と電流に変換します.アダプタは変換と包装の役割を果たします.
Adapter設計モードの主な目的は2つの非コヒーレントクラスを組み合わせて、よく2つの方法があります:第1の解決策はそれぞれのクラスのインタフェースを修正することです.ただし、ソースコードがない場合や、1つのアプリケーションのためにそれぞれのインタフェースを変更したくない場合は、Adapterアダプタを使用して、2つのインタフェースの間にハイブリッドインタフェースを作成する必要があります.
Adapterアダプタ設計モードには、アダプターAdaptee、アダプタAdapter、ターゲットオブジェクトTargetの3つの重要な役割があります.既存の2つのクラスを組み合わせたいクラスは、それぞれアダプターAdapteeとターゲットオブジェクトTargetの役割であり、アダプタAdapterを作成して組み合わせる必要があります.
Adapterアダプタの設計モードを実現するには、コンビネーション(compositon,has-a関係)と継承(inheritance,is-a関係)の2つの方法があります.
オブジェクトアダプタモードでは、以下のように組み合わせられています.
クラスアダプタモードでは継承が使用されます.UML図は次のとおりです.
図形を描くには、円形と四角の2つのクラスがあるとします.円形と四角を描くことができるクラスが必要です.
コンビネーションリレーションのAdapterアダプタモードは次のとおりです.
//  ,    
class Cirecle{
	public void drawCircle(){
	System.out.println(“Draw circle”);
}
}
//  ,     
class Square{
	public void drawSquare(){
	System.out.println(“Draw square”);
}
}
//      ,      ,   
public class HybridShape extends Circle{
	private Square square;
	public HybridShape(Square square){
	this.square = square;
}
public void drawSquare(){
	square.drawSquare();
}
} 

アダプターはターゲットオブジェクトを継承し、同時に適合オブジェクトを組み合わせ、円を描く必要がある場合は親の円を描く方法を直接呼び出せばよく、正方形を描く必要がある場合は、適合オブジェクトの四角形を描く方法を呼び出す.
関係を継承するAdapterアダプタのモードは次のとおりです.
interface ICircle{
	public void drawCircle();
}
interface ISquare{
	public void drawSquare();
}
//  
class Cirecle implements ICircle{
	public void drawCircle(){
	System.out.println(“Draw circle”);
}
}
//  
class Square implements ISquare{
	public void drawSquare(){
	System.out.println(“Draw square”);
}
}
//      ,      ,   
public class HybridShape implements ICircle, ISquare{
	private ISquare square;
	private ICircle circle;
	public HybridShape(Square square){
	this.square = square;
}
public HybridShape(Circle circle){
	this.circle = circle;
}
public void drawSquare(){
	square.drawSquare();
}
public void drawCircle(){
	circle.drawCircle();
}
} 

Javaではクラスはマルチ継承は許されませんが、複数のインタフェースを実現できます.関係を継承するAdapterアダプタの設計モードはjavaを利用して複数のインタフェースを実現できる特性です.
JDK内のアダプタモード応用:

java.util.Arrays#asList
()

java.io.InputStreamReader
(
InputStream
)

java.io.OutputStreamWriter
(
OutputStream
)

javax.xml.bind.annotation.adapters.XmlAdapter#marshal
()

javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal
()