適配器模式
好久沒有寫博客了,最近都挺忙的,今天晚上睡不着,想想也不知道幹啥,把最近自己在小組分享的適配器設計模式寫出來,也就是按照自己ppt的流程來的。以後有空,陸陸續續把小組分享的設計模式寫成博客。
1 問題的引入
long long ago,還記得在初中的時候,我們用手機拍了好多好看的圖片,圖片存在手機的內存卡(tf卡)裏,某一天需要把好看的圖片上傳到QQ空間,那麼如何把tf卡里的照片傳輸到電腦上呢?
1.1 我們的方式
2 適配器介紹及定義
在軟件開發中有時也會存在以上電腦和TF卡不兼容的情況,這樣可以引入SD卡(類似讀卡器)那樣一個適配器來協調這些存在不兼容的結構,這種設計方案就是適配器模式。
定義:
將一個類的接口變換成客戶端所期待的另一種接口,適配器模式讓那些接口不兼容的類可以一起工作。
2.1 適配器種類
適配器模式包括對象適配器和類適配器。
2.2 UML圖
Target(目標抽象類): 抽象定義客戶所需的接口,可以是一個抽象類,或者接口,也可以是具體類。
Adaptee(適配者類): 它定義了一個已經存在的接口,這個接口需要適配,適配者類一般是一個具體類,包括了客戶所需要的業務方法。
Adapter(適配器類): 它可以調用另一個接口,作爲一個轉換器,對Adapter和Target進行適配。適配器是適配器模式的核心,在類適配器中,它通過實現Target接口並繼承Adaptee類來使二者產生聯繫;在對象適配器中,它通過繼承Target並關聯一個Adaptee對象使二者產生聯繫。
2.3 兩種適配器的區別
區別:
1.在對象適配器模式當中,適配器和適配者是關聯關係。
2.在類適配器模式中,適配器和適配者之間是繼承(或者實現)關係。
3.由於Java不支持多重類繼承,因此類適配器的使用受到很多限制,例如如果目標抽象類Target不是接口,而是一個類,就無法使用類適配器。大部分情況下我們使用的是對象適配器,類適配器較少使用。
3代碼講解
實例: 回到剛開頭的那個例子,計算機如何通過SD(讀卡器)讀取TF卡(通過對象適配器的模式)?
3.1 編寫Target
3.1.1 聲明Computer接口及其具體實現類
public interface Computer {
/**
* sdCard對象傳參
* @param sdCard
* @return
*/
String readSD(SDCard sdCard);
}
public class ThinkpadComputer implements Computer {
/**
* 創建一個計算機實例,實現計算機接口,並實現其讀取SD卡方法
* @param sdCard
* @return
*/
@Override
public String readSD(SDCard sdCard) {
if(sdCard == null){
throw new NullPointerException("sdCard is null");
}
//返回sdCard的read方法
return sdCard.readSD();
}
}
3.1.2 聲明SDCard接口及其具體實現類
public interface SDCard {
/**
* 創建一個SD卡的接口,讀取SD卡
* @return
*/
String readSD();
}
public class SDCardImpl implements SDCard {
/**
* 創建SD卡接口的實現類,模擬SD卡的功能:
* @return
*/
@Override
public String readSD() {
String msg = "sdCard read a message: wow this is sdCard!";
return msg;
}
}
3.2 編寫Adaptee
3.2.1 創建TF卡接口及其具體實現類
public interface TFCard {
/**
* 創建TF卡接口
* @return
*/
String readTF();
}
public class TFCardImpl implements TFCard {
/**
* 創建TF卡實例
* @return
*/
@Override
public String readTF() {
String msg ="tfCard read e message : wow this is tfCard.";
return msg;
}
}
3.3 編寫Adapter
3.3.1 創建適配器類
public class SDAdapterTF implements SDCard {
/**
* 創建SD卡適配TF卡 ,實現SDCard接口
* 將要適配的對象作爲適配器的屬性引入
*/
private TFCard tfCard;
public SDAdapterTF(TFCard tfCard){
this.tfCard = tfCard;
}
@Override
public String readSD() {
System.out.println("adapter read tfCard.");
return tfCard.readTF();
}
}
3.4 創建Client
3.4.1 創建測試方法調用
/**
* 測試計算機通過SD讀卡器讀取TF卡
*/
@Test
public void test(){
//模擬計算機通過SD讀卡器讀取TF卡
Computer computer = new ThinkpadComputer();
TFCard tfCard = new TFCardImpl();
SDCard tfCardAdapterSD = new SDAdapterTF(tfCard);
System.out.println(computer.readSD(tfCardAdapterSD));
}
4 總結
適用場景:
將一個類的接口變換成客戶端所期待的另一種接口,適配器模式讓那些接口不兼容的類可以一起工作。
兩類適配器:
對象適配器和類適配器,類適配器較少使用。