java 開發模式之七 : 適配器模式

原理或定義

適配器就是一種適配中間件,它存在於不匹配的二者之間,用於連接二者,將不匹配變得匹配,簡單點理解就是平常所見的轉接頭,轉換器之類的存在

將一類的接口轉換成客戶希望的另外一個接口,Adapter模式使得原本由於接口不兼容而不能一起工作那些類可以一起工

結構

目標接口(Target): 客戶所期待的接口。目標可以是具體的或抽象的類,也可以是接

需要適配的類(Adaptee): 需要適配的類或適配者

適配器(Adapter): 通過包裝一個需要適配的對象,把原接口轉換成目標接

分類

1) 類適配器
當客戶在接口中定義了他期望的行爲時,我們就可以應用適配器模式,提供一個實現該接口的類,並且擴展已有的類,通過創建子類來實現適配。

2)對象適配器 (推薦使用)
對象適配器通過組合除了滿足"用戶期待的接口"還降低了代碼間的不良耦合。

3)缺省適配器
缺省適配器模式是一種特殊的適配器模式,但這個適配器是由一個抽象類實現的,並且在抽象類中要實現目標接口中所規定的所有方法,但很多方法的實現都是空方法,而具體的子類都要繼承此抽象類

類圖


案例與代碼

本模式用火雞冒充鴨子的案例來做示例


類適配器解決方案:

類圖:



鴨子接口:

public interface Duck {
	public void quack();
	public void fly();
}


鴨子實現類:

public class GreenHeadDuck implements Duck {

	@Override
	public void quack() {
		// TODO Auto-generated method stub
		System.out.println(" Ga Ga");
	}

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("I am flying a long distance");
	}

}


火雞接口:

public interface Turkey {

	public void gobble();
	public void fly();

}

火雞實現類:
public class WildTurkey implements Turkey {

	@Override
	public void gobble() {
		// TODO Auto-generated method stub
		System.out.println(" Go Go");
	}

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("I am flying a short distance");
	}

}

適配器類:

public class TurkeyAdapter extends WildTurkey implements Duck {

	@Override
	public void quack() {
		// TODO Auto-generated method stub
		super.gobble();
	}
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		super.fly();
		super.fly();
		super.fly();
	}
}


管理 / 測試類:

public class MainTest {
	public static void main(String[] args) {
		
		Duck duck2turkeyAdapter=new TurkeyAdapter();
		duck2turkeyAdapter.quack();
		duck2turkeyAdapter.fly();
		
	
	}
}




對象適配器解決方案:


類圖:



適配器類:

public class TurkeyAdapter implements Duck {
	private Turkey turkey;
	
	public TurkeyAdapter(Turkey turkey)
	{
		this.turkey=turkey;
	}

	@Override
	public void quack() {
		// TODO Auto-generated method stub
		turkey.gobble();
	}

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		for(int i=0;i<6;i++)
		{
			turkey.fly();
		}
	}

}

對象適配器和類適配器使用了不同的方法實現適配,對象適配器使用組合,類適配器使用繼承。


使用場景

類適配器與對象適配器的使用場景一致,二者主要用於如下場景:

(1)想要使用一個已經存在的類,但是它卻不符合現有的接口規範,導致無法直接去訪問,這時創建一個適配器就能間接去訪問這個類中的方法。

(2)我們有一個類,想將其設計爲可重用的類(可被多處訪問),我們可以創建適配器來將這個類來適配其他沒有提供合適接口的類。

 

接口適配器使用場景

1)想要使用接口中的某個或某些方法,但是接口中有太多方法,我們要使用時必須實現接口並實現其中的所有方法,可以使用抽象類來實現接口,並不對方法進行實現(僅置空),然後我們再繼承這個抽象類來通過重寫想用的方法的方式來實現。這個抽象類就是適配器。

接口適配器代碼

目標接口:A

public interface A {
    	    void a();
    	    void b();
    	    void c();
    	    void d();
   	     void e();
    	    void f();
}


 

適配器:Adapter

public abstract class Adapter implements A {
    public void a(){}
    public void b(){}
    public void c(){}
    public void d(){}
    public void e(){}
    public void f(){}
}


 

實現類:Ashili

public class Ashili extends Adapter {
    public void a(){
        System.out.println("實現A方法被調用");
    }
    public void d(){
        System.out.println("實現d方法被調用");
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章