アダプターモード---姚明がバスケットボールをする例


アダプタモードは、構造型モードに属し、1つのクラスのインタフェースをお客様が望む別のインタフェースに変換する主な役割を果たします.アダプタモードにより、インタフェースが互換性がないため一緒に動作できないクラスが一緒に動作します.
適用状況:
次の場合、アダプタ・モードを使用します.•既存のクラスを使用したいのですが、インタフェースがニーズに合っていません.•他の非関連クラスや予見不可能なクラス(インタフェースが必ずしも互換性がないクラス)と連携して動作する多重化可能なクラスを作成したいと考えています.•(オブジェクトAdapterのみ)既存のサブクラスを使用したいのですが、インタフェースを一致させるために各サブクラス化することはできません.オブジェクトアダプタは、親インタフェースに適しています. 
大話設計モードの定義:1つのクラスのインタフェースを顧客が望む別のインタフェースに変換し、Adapterモードは元のインタフェースが互換性がなく、一緒に仕事をできないクラスを一緒に仕事をすることができる.
クラスアダプタとオブジェクトアダプタの2種類がありますが、java C#は多くの継承を許さないため、ここではオブジェクトアダプタのみを紹介します.
Targetクラス:これはお客様が期待しているインタフェースです.ターゲットは、具体的または抽象的な額クラスであってもよいし、インタフェースであってもよい.
Adapteeクラス:既存のインタフェース(クラスであってもよいと思いますi)を定義します.このインタフェースは適切にする必要があります.このクラスはTargetクラスに似ていますが、違います.
Adaperクラス: これはアダプタクラスAdapterです.一般的にこのアダプタクラスはTargetクラスを継承し、内部にAdapteeオブジェクトをパッケージし、ソースインタフェースをターゲットインタフェースに変換する必要があります.
これはオブジェクトアダプタの抽象的な実装です
    package com.visionsky.DesignPattern; 
     
    interface Target { 
        void Request(); 
    } 
     
    class Adaptee { 
        void SpecificRequst() { 
            System.out.println("Adaptee's SpecificRequst"); 
        } 
    } 
     
    class Adapter  implements Target  
    { 
     
        private Adaptee adaptee; 
        public Adapter() 
        { 
            this.adaptee=new Adaptee(); 
        } 
         
        @Override 
        public void Request() { 
             System.out.println("Adapter's Request"); 
             adaptee.SpecificRequst(); 
        } 
     
    } 
     
    public class AdapterDemo { 
     
        /** 
         * @param args 
         */ 
        public static void main(String[] args) { 
            // TODO Auto-generated method stub 
            Target t=new Adapter(); 
            t.Request(); 
        } 
     
    } 

姚明の球技の実例:姚明は選手の一人だが、選手たちの抽象類は英語を話しているので、姚明は分からない.姚明が理解できるようにインタフェースを変えるにはAdaperクラスが必要です
/*
 *   Target 
 *           。              ,      
 */
public abstract class Player {
	protected String name;

	public Player(String name) {
		this.name = name;
	}

	public abstract void Attack();

	public abstract void Defense();
}


public class Center extends Player{
	public Center(String name){
		super(name);
	}

	@Override
	public void Attack() {
		System.out.println("    !");
	}

	@Override
	public void Defense() {
		System.out.println("    !");
	}
}

/*
 * Adaptee 
 *     Target   (  )     (       )
 *         Adapter(   )   Target   
 *               
 */
public class ForeignCenter {
	protected String name;
	/*public ForeignCenter(String name){
		this.name = name;
	}*/
	public void   (){
		System.out.println("      !");
	}
	public void   (){
		System.out.println("      !");
	}
}

public class ForwardFirst extends Player{
	public ForwardFirst(String name){
		super(name);
	}

	@Override
	public void Attack() {
		System.out.println("1     !");
	}

	@Override
	public void Defense() {
		System.out.println("1     !");
	}
}


public class GuardFirst extends Player{

	public GuardFirst(String name){
		super(name);
	}

	@Override
	public void Attack() {
		System.out.println("1     !");
	}

	@Override
	public void Defense() {
		System.out.println("1     !");
	}
	
}

/*
 *         Adapter,           Target 
 *           (Adaptee   )    Target   
 *         Adaptee  ,           
 */
public class Translator extends Player{
    private ForeignCenter wjzf  = new ForeignCenter();
	public Translator(String name) {
		super(name);
		wjzf.name = name;
	}
	@Override
	public void Attack() {
		wjzf.  ();
	}
	@Override
	public void Defense() {
		wjzf.  ();
	}
}

public class MainTest {
	public static void main(String args[]) {
		Player b = new ForwardFirst("   ");
		b.Attack();

		Player m = new GuardFirst("     ");
		m.Attack();

		//        ,     ,    
		Player ym = new Translator("  ");
		ym.Attack();
		ym.Defense();
	}
}