Java 設計模式04 適配器模式
1 適配器模式 簡介
適配器模式(有時候也稱包裝樣式或者包裝)將一個類的接口適配成用戶所期待的。一個適配允許通常因爲接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。
1.1 適配器模式 模式
- 對象適配器模式
在這種適配器模式中,適配器容納一個它包裹的類的實例。在這種情況下,適配器調用被包裹對象的物理實體。 - 類適配器模式
這種適配器模式下,適配器繼承自已實現的類(一般多重繼承)。
1.2 適配器模式 優點
- 類適配器模式
由於適配器adapter類是適配者adaptee類的子類,因此可以在適配器類中置換一些適配者的方法,即Override(重寫),使得適配器的靈活性更強。 - 對象適配器模式
一個對象適配器可以把多個不同的適配者adaptee適配到一個目標,也就是說,同一個適配器可以將適配者類和它的子類都適配到目標接口。
1.2 適配器模式 缺點
- 類適配器模式
java8之前:接口沒有default方法,就是沒有實現了具體邏輯的方法,而且不支持類多繼承,所以適配者類只能有一個。
java8之後:接口有了default方法,接口中的方法有了實現,因爲接口是多繼承的,所以適配者可以是多個帶有default方法的接口,但是接口是不可以實例化的,實際上沒有什麼意義。有個解決方法就是,接口裏都是default方法,實現接口的類什麼也沒做,就是提供一個可以實例化的類。這樣的化,類適配器模式中適配者adapter類就可以適配多個適配者adaptee類了。這個解決方法只是我理論上論證一下,實際上可行與否,請自行判斷驗證。 - 對象適配器模式
類適配器模式的優點就是對象適配器模式的缺點,不能置換適配者類的方法。如果想修改適配者類的一個或多個方法,就只好先創建一個繼承與適配者類的子類,把適配者類的方法置換掉,然後把適配者的子類當做真正的適配者進行適配,實現過程較爲複雜。
2 適配器模式 UML 圖
角色 | 名稱 | 功能 |
---|---|---|
目標抽象類 | Target | |
適配器類 | Adapter | |
適配者類 | Adaptee | |
客戶類 | Client |
3 適配器模式 實現
2.1 目標抽象類
package com.xu.modle.mode2;
/**
* 目標抽象類
* @author hyacinth
* @date 2019年10月12日12:30:09
*
*/
public interface Target {
/**
* 目標抽象類
* @return Java 數據庫 連接方式
*/
public String JDBC();
}
2.2 適配器類
package com.xu.modle.mode2;
/**
* 適配器類
* @author hyacinth
* @date 2019年10月12日12:30:09
*
*/
public class Adapter extends Adaptee implements Target {
@Override
public String JDBC() {
String jdbc = connection();
System.out.println("適配器 默認數據庫連接方式:"+jdbc);
jdbc = "MySQL";
System.out.println("適配器 修改數據庫連接方式:"+jdbc);
return jdbc;
}
}
2.3 適配者類
package com.xu.modle.mode2;
/**
* 適配者類
* @author hyacinth
* @date 2019年10月12日12:30:09
*
*/
public class Adaptee {
private String jdbc = "Java";
public String connection() {
System.out.println("默認數據庫連接方式:"+jdbc);
return jdbc;
}
}
2.4 客戶類
package com.xu.modle.mode2;
public class Client {
public static void main(String[] args) {
Target target = new Adapter();
System.out.println(target.JDBC());
}
}