前言(一些廢話,可以忽略)
- 4種創建型模式就已經梳理完了,總的來說還是很簡單,只要把握住核心思想,代碼這種具象的東西都不會跑偏
- 今天來聊一聊第一種,比較簡單的結構型設計模式,適配器模式
- PS.部分類實現見文末
要解決的問題
- 適配器模式顧名思義,就是要將一個類與另外一個類連接起來,但是他們的接口關係不匹配,不能直接連接,所以我們只能使用某種結構方式,來講一個接口轉爲另外一個接口可以調用的形式
- 當然用更簡單的話說,就是起一個轉接頭的作用,像充電器一樣,將220V的電壓轉爲5V
- 這裏我們使用泰國標準和中國標準的插座來進行舉例
基於類的適配器模式
- 既然是基於類的,那麼被適配、被轉換的對象就是需要們繼承的一個類
/**
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-26 26:21
**/
public class ThailandStandard {
public void charge(){
System.out.println("給手機充電");
}
}
- 我們要使用的是中國標準,通過一個指定中國標準的接口
/**
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-26 26:21
**/
public interface ChinaStandard {
void charge();
}
- 不能直接使用泰國標準,所以需要將其轉換爲中國標準
/**
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-26 26:21
**/
public class ClassAdapter extends ThailandStandard implements ChinaStandard {
}
- 基本結構就已經完成了,接下來再看一下如何使用
- 通過創建一個適配器對象,就可以獲得一個兼容中國標準的子類,但是當你實際調用時,使用的卻是泰國的插座,這就達到了我們的效果
/**
* 類對象適配器
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-26 26:21
**/
public class ClassMode {
public static void main(String[] args) {
ChinaStandard chager = new ClassAdapter();
chager.charge();
}
}
- 基於類的適配器模式,通過繼承來實現轉換,而我們知道,繼承這東西不具有靈活性,且有較強的依賴性,是不推薦使用的,那麼我們有沒有什麼更好的方式呢
基於對象的適配器模式
- 基於對象的適配器,不再採用繼承的方式,而是通過聚合的方式,這樣就適當降低了依賴,更加的靈活
- 聚合的是被轉換類的對象,所以稱爲基於對象的適配器模式
/**
* 對象適配器
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-26 26:21
**/
public class ObjectAdapter implements ChinaStandard {
private ThailandStandard thailandStandard;
public ObjectAdapter(ThailandStandard thailandStandard) {
this.thailandStandard = thailandStandard;
}
@Override
public void charge() {
thailandStandard.charge();
}
}
- 其他的相關類無需變動,當然這裏也可以用組合的方式
基於接口的適配器模式
- 最後一種適配器模式的方式爲基於接口,將被適配的類通過實現接口,將需要的轉接寫在抽象類中
- 下面爲我們要實現的類
/**
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-26 26:21
**/
public interface ThailandStandard {
void charge();
void quickCharge();
}
- 我們的適配器去實現被適配的接口
/**
* 接口適配器
*
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-26 26:21
**/
public abstract class InterfaceAdapter implements ThailandStandard {
@Override
public void charge() {
System.out.println("InterfaceAdapter.charge");
}
@Override
public void quickCharge() {
throw new UnsupportedOperationException();
}
}
- 轉接爲中國的標準後,可以加上自己的相關實現方法,比如說降壓之類的
/**
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-26 26:21
**/
public class ChinaStandard extends InterfaceAdapter{
}
- 這就是使用過程
/**
* 接口適配器
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-26 26:21
**/
public class InterfaceMode {
public static void main(String[] args) {
ChinaStandard standard = new ChinaStandard();
standard.charge();
}
}
總結
- 適配器模式大概就是這三種了,主要根據已經存在的類進行選擇使用哪一種模式
- 這個模式的核心就是將一個我們要使用的類通過繼承、實現 、聚合組合,轉爲我們另外一個我們可以直接調用的類, bingo!
願你不捨愛與自由。