java設計模式-適配器模式

與電源適配器相似,在適配器模式中引入了一個被稱爲適配器(Adapter)的包裝類,而它所包裝的對象稱爲適配者(Adaptee),即被適配的類。適配器的實現就是把客戶類的請求轉化爲對適配者的相應接口的調用。也就是說:當客戶類調用適配器的方法時,在適配器類的內部將調用適配者類的方法,而這個過程對客戶類是透明的,客戶類並不直接訪問適配者類。因此,適配器讓那些由於接口不兼容而不能交互的類可以一起工作。

適配器模式定義如下:將一個接口轉換成客戶希望的另一個接口,使接口不兼容的那些類可以一起工作,其別名爲包裝器(Wrapper)。適配器模式既可以作爲類結構型模式,也可以作爲對象結構型模式。

適配器模式包含角色:

① Target(目標抽象類):目標抽象類定義客戶所需接口,可以是一個抽象類或接口,也可以是具體類。
② Adapter(適配器類):適配器可以調用另一個接口,作爲一個轉換器,對Adaptee和Target進行適配,適配器類是適配器模式的核心,在對象適配器中,它通過繼承Target並關聯一個Adaptee對象使二者產生聯繫。
③ Adaptee(適配者類):適配者即被適配的角色,它定義了一個已經存在的接口,這個接口需要適配,適配者類一般是一個具體類,包含了客戶希望使用的業務方法,在某些情況下可能沒有適配者類的源代碼。

下面我們將以“電器適配充電”爲例,對適配器模式進行鞏固學習:

/**
 * 標準充電模式220v
 */
public interface Standardcharging {

	void charge();
}
/**
 * 電腦充電 10v
 * 
 */
public class ComputerCharging {

	public void charge() {
		System.out.println("開始給電腦充電");
	}
}
/**
 *充電適配器 
 */
public class ChargingAdapter implements Standardcharging {

	private ComputerCharging computerCharging;
	
	public ChargingAdapter() {
		computerCharging = new ComputerCharging();
	}
	
	@Override
	public void charge() {
		computerCharging.charge();
	}

}
/**
 * 客戶端調用
 */
public class Client {

	public static void main(String[] args) {
		Standardcharging scharging = new ChargingAdapter();
		scharging.charge();
	}
}

在本實例中使用了對象適配器模式,如果需要使用其他電器進行充電,可以增加一個新的適配器類,原有代碼無須修改。

除了對象適配器模式之外,適配器模式還有一種形式,那就是類適配器模式。類適配器模式和對象適配器模式最大的區別在於適配器和適配者之間的關係不同,對象適配器模式中適配器和適配者之間是關聯關係,而類適配器模式中適配器和適配者是繼承關係。

public class Adapter extends Adaptee implements Target {
public void request() {
specificRequest();
}
}

缺省適配器模式是適配器模式的一種變體,其應用也較爲廣泛。缺省適配器模式的定義如下:
缺省適配器模式(Default Adapter Pattern):當不需要實現一個接口所提供的所有方法時,可先設計一個抽象類實現該接口,併爲接口中每個方法提供一個默認實現(空方法),那麼該抽象類的子類可以選擇性地覆蓋父類的某些方法來實現需求,它適用於不想使用一個接口中的所有方法的情況,又稱爲單接口適配器模式。

 在缺省適配器模式中,包含如下三個角色:

① ServiceInterface(適配者接口):它是一個接口,通常在該接口中聲明瞭大量的方法。
② AbstractServiceClass(缺省適配器類):它是缺省適配器模式的核心類,使用空方法的形式實現了在ServiceInterface接口中聲明的方法。通常將它定義爲抽象類,因爲對它進行實例化沒有任何意義。
③ ConcreteServiceClass(具體業務類):它是缺省適配器類的子類,在沒有引入適配器之前,它需要實現適配者接口,因此需要實現在適配者接口中定義的所有方法,而對於一些無須使用的方法也不得不提供空實現。在有了缺省適配器之後,可以直接繼承該適配器類,根據需要有選擇性地覆蓋在適配器類中定義的方法。

主要優點:

(1) 將目標類和適配者類解耦,通過引入一個適配器類來重用現有的適配者類,無須修改原有結構。
(2) 增加了類的透明性和複用性,將具體的業務實現過程封裝在適配者類中,對於客戶端類而言是透明的,而且提高了適配者的複用性,同一個適配者類可以在多個不同的系統中複用。
(3) 靈活性和擴展性都非常好,通過使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎上增加新的適配器類,完全符合“開閉原則”。

主要缺點:

(1) 對於Java、C#等不支持多重類繼承的語言,一次最多隻能適配一個適配者類,不能同時適配多個適配者;
(2) 適配者類不能爲最終類,如在Java中不能爲final類,C#中不能爲sealed類;
(3) 在Java、C#等語言中,類適配器模式中的目標抽象類只能爲接口,不能爲類,其使用有一定的侷限性。

適用場景:

(1) 系統需要使用一些現有的類,而這些類的接口(如方法名)不符合系統的需要,甚至沒有這些類的源代碼。
(2) 想創建一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。

 

 

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