目錄
一、適配器模式介紹
1.1 適配器模式定義
1.2 適配器模式原理
1.2.1 適配器模式類圖
1.2.2 模式角色說明
二、適配器模式的應(yīng)用
2.1 類適配器模式
2.1.1 需求說明
2.1.2 需求實現(xiàn)
2.1.2.1 類圖
2.1.2.2 具體實現(xiàn)
2.1.2.2.1 SDCard接口
2.1.2.2.2 SDCardImpl實現(xiàn)類
2.1.2.2.3 TFCard接口
2.1.2.2.4 TFCardImpl 實現(xiàn)類
2.1.2.2.5 SDAdapterTF適配類
2.1.2.2.6 Computer接口調(diào)用類
2.1.2.2.7 測試類
2.2 對象適配器模式
2.2.1 需求說明
2.2.2 需求實現(xiàn)
2.2.2.1 類圖
2.2.2.2 具體實現(xiàn)
2.2.2.2.1 適配器實現(xiàn)類
2.2.2.2.2 測試類
三、適配器模式總結(jié)
3.1 適配器模式的優(yōu)點
3.2 適配器模式的缺點
3.3 適配器模式適用的場景
3.4 代理、橋接、裝飾器、適配器 4 種設(shè)計模式的區(qū)別
一、適配器模式介紹
1.1 適配器模式定義
適配器模式(adapter pattern )的原始定義是:將類的接口轉(zhuǎn)換為客戶期望的另一個接口,適配器可以讓不兼容的兩個類一起協(xié)同工作。
如果去歐洲國家去旅游的話,他們的插座如下圖最左邊,是歐洲標(biāo)準(zhǔn)。而我們使用的插頭如下圖最右邊的。因此我們的筆記本電腦,手機(jī)在當(dāng)?shù)夭荒苤苯映潆?。所以就需要一個插座轉(zhuǎn)換器,轉(zhuǎn)換器第1面插入當(dāng)?shù)氐牟遄?br> 第2面供我們充電,這樣使得我們的插頭在當(dāng)?shù)啬苁褂谩I钪羞@樣的例子很多,手機(jī)充電器(將220v轉(zhuǎn)換為5v的電壓),讀卡器等,其實就是使用到了適配器模式。
適配器模式是用來做適配,它將不兼容的接口轉(zhuǎn)換為可兼容的接口,讓原本由于接口不兼容而不能一起工作的類可以一起工作。適配器模式有兩種實現(xiàn)方式:類適配器和對象適配器。其中,類適配器使用繼承關(guān)系來實現(xiàn),對象適配器使用組合關(guān)系來實現(xiàn)。類適配器模式的耦合度比后者高,且要求程序員了解現(xiàn)有組件庫中的相關(guān)組件的內(nèi)部結(jié)構(gòu),所以應(yīng)用相對較少些。
1.2 適配器模式原理
1.2.1 適配器模式類圖
1.2.2 模式角色說明
適配器模式(Adapter)包含以下主要角色:
- 目標(biāo)(Target)接口:當(dāng)前系統(tǒng)業(yè)務(wù)所期待的接口,它可以是抽象類或接口。
- 適配者(Adaptee)類:適配者即被適配的角色,它是被訪問和適配的現(xiàn)存組件庫中的組件接口。
- 適配器(Adapter)類:它是一個轉(zhuǎn)換器,通過繼承或引用適配者的對象,把適配者接口轉(zhuǎn)換成目標(biāo)接口,讓客戶按目標(biāo)接口的格式訪問適配者。
二、適配器模式的應(yīng)用
2.1 類適配器模式
2.1.1 需求說明
假設(shè)現(xiàn)有一臺電腦目前只能讀取SD卡的信息,這時我們想要使用電腦讀取TF卡的內(nèi)容, 就需要將TF卡加上卡套,轉(zhuǎn)換成SD卡!
2.1.2 需求實現(xiàn)
2.1.2.1 類圖
2.1.2.2 具體實現(xiàn)
2.1.2.2.1 SDCard接口
package main.java.cn.test.adapter.V1;
/**
* @author ningzhaosheng
* @date 2024/1/14 12:07:50
* @description SD卡接口
*/
public interface SDCard {
//讀取SD卡方法
String readSD();
//寫入SD卡功能
void writeSD(String msg);
}
2.1.2.2.2 SDCardImpl實現(xiàn)類
package main.java.cn.test.adapter.V1;
/**
* @author ningzhaosheng
* @date 2024/1/14 12:08:21
* @description SD卡實現(xiàn)類
*/
public class SDCardImpl implements SDCard {
@Override
public String readSD() {
String msg = "sd card reading data";
return msg;
}
@Override
public void writeSD(String msg) {
System.out.println("sd card write data : " + msg);
}
}
2.1.2.2.3 TFCard接口
package main.java.cn.test.adapter.V1;
/**
* @author ningzhaosheng
* @date 2024/1/14 12:09:15
* @description TF卡接口
*/
public interface TFCard {
//讀取TF卡方法
String readTF();
//寫入TF卡功能
void writeTF(String msg);
}
2.1.2.2.4 TFCardImpl 實現(xiàn)類
package main.java.cn.test.adapter.V1;
/**
* @author ningzhaosheng
* @date 2024/1/14 12:09:47
* @description TF卡實現(xiàn)類
*/
public class TFCardImpl implements TFCard {
@Override
public String readTF() {
String msg = "tf card reading data";
return msg;
}
@Override
public void writeTF(String msg) {
System.out.println("tf card write data : " + msg);
}
}
2.1.2.2.5 SDAdapterTF適配類
package main.java.cn.test.adapter.V1;
/**
* @author ningzhaosheng
* @date 2024/1/14 12:10:29
* @description 定義適配器類(SD兼容TF)
*/
public class SDAdapterTF extends TFCardImpl implements SDCard {
@Override
public String readSD() {
System.out.println("adapter read tf card ");
return readTF();
}
@Override
public void writeSD(String msg) {
System.out.println("adapter write tf card");
writeTF(msg);
}
}
2.1.2.2.6 Computer接口調(diào)用類
package main.java.cn.test.adapter.V1;
/**
* @author ningzhaosheng
* @date 2024/1/14 12:13:15
* @description
*/
public class Computer{
public String read(SDCard sdCard) {
return sdCard.readSD();
};
}
2.1.2.2.7 測試類
package main.java.cn.test.adapter.V1;
/**
* @author ningzhaosheng
* @date 2024/1/14 12:11:39
* @description 測試類
*/
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
SDCard sdCard = new SDCardImpl();
System.out.println(computer.read(sdCard));
System.out.println("========================");
SDAdapterTF adapterTF = new SDAdapterTF();
System.out.println(computer.read(adapterTF));
}
}
2.2 對象適配器模式
2.2.1 需求說明
假設(shè)現(xiàn)有一臺電腦目前只能讀取SD卡的信息,這時我們想要使用電腦讀取TF卡的內(nèi)容, 就需要將TF卡加上卡套,轉(zhuǎn)換成SD卡! 適用對象適配器模式實現(xiàn)。
2.2.2 需求實現(xiàn)
2.2.2.1 類圖
2.2.2.2 具體實現(xiàn)
2.2.2.2.1 適配器實現(xiàn)類
package main.java.cn.test.adapter.V2;
import main.java.cn.test.adapter.V1.SDCard;
import main.java.cn.test.adapter.V1.TFCard;
/**
* @author ningzhaosheng
* @date 2024/1/14 12:31:54
* @description 定義適配器類(SD兼容TF)
*/
public class SDAdapterTF implements SDCard {
private TFCard tfCard;
public SDAdapterTF(TFCard tfCard) {
this.tfCard = tfCard;
}
@Override
public String readSD() {
System.out.println("adapter read tf card ");
return tfCard.readTF();
}
@Override
public void writeSD(String msg) {
System.out.println("adapter write tf card");
tfCard.writeTF(msg);
}
}
2.2.2.2.2 測試類
package main.java.cn.test.adapter.V2;
import main.java.cn.test.adapter.V1.*;
/**
* @author ningzhaosheng
* @date 2024/1/14 12:33:18
* @description
*/
public class Test2 {
public static void main(String[] args) {
Computer computer = new Computer();
SDCard sdCard = new SDCardImpl();
System.out.println(computer.read(sdCard));
System.out.println("========================");
TFCard tfCard = new TFCardImpl();
SDAdapterTF adapterTF = new SDAdapterTF(tfCard);
System.out.println(computer.read(adapterTF));
}
}
三、適配器模式總結(jié)
3.1 適配器模式的優(yōu)點
1. 將目標(biāo)類和適配者類解耦,通過引入一個適配器類來重用現(xiàn)有的適配者類,無序修改原有結(jié)構(gòu)
2. 增加了類的透明性和復(fù)用性,將具體業(yè)務(wù)實現(xiàn)過程封裝在適配者類中,對于客戶端類而言是透明的,而且提高了適配者的復(fù)用性,同一個適配者類可以在多個不同的系統(tǒng)中復(fù)用。
3. 靈活性和擴(kuò)展性都非常好,通過使用配置文件可以很方便的更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類,符合開閉原則。
3.2 適配器模式的缺點
- 類適配器的缺點
- 對于Java等不支持多重繼承的語言,一次最多只能適配一個適配者類,不能同時適配多個適配者
- 適配者類不能為最終類
- 對象適配器的缺點
- 與類適配器模式相比較,在該模式下要在適配器中置換適配者類的某些方法比較麻煩。
3.3 適配器模式適用的場景
- 統(tǒng)一多個類的接口設(shè)計時
某個功能的實現(xiàn)依賴多個外部系統(tǒng)(或者說類)。通過適配器模式,將它們的接口適配為統(tǒng)一的接口定義
- 需要依賴外部系統(tǒng)時
當(dāng)我們把項目中依賴的一個外部系統(tǒng)替換為另一個外部系統(tǒng)的時候,利用適配器模式,可以減少對代碼的改動
- 原有接口無法修改時或者原有接口功能太老舊但又需要兼容;
JDK1.0 Enumeration 到 Iterator 的替換,適用適配器模式保留Enumeration 類,并將其實現(xiàn)替換為直接調(diào)用 Itertor。
- 適配不同數(shù)據(jù)格式時;
Slf4j 日志框架,定義打印日志的統(tǒng)一接口,提供針對不同日志框架的適配器
3.4 代理、橋接、裝飾器、適配器 4 種設(shè)計模式的區(qū)別
代理、橋接、裝飾器、適配器,這 4 種模式是比較常用的結(jié)構(gòu)型設(shè)計模式。它們的代碼結(jié)構(gòu)非常相似。但其各自的用意卻不同,簡單說一下它們之間的關(guān)系。
- 代理模式:
代理模式在不改變原始類接口的條件下,為原始類定義一個代理類,主要目的是控制訪問,而非加強(qiáng)功能,這是它跟裝飾器模式最大的不同。
- 橋接模式:
橋接模式的目的是將接口部分和實現(xiàn)部分分離,從而讓它們可以較為容易、也相對獨立地加以改變。
- 裝飾器模式:
裝飾者模式在不改變原始類接口的情況下,對原始類功能進(jìn)行增強(qiáng),并且支持多個裝飾器的嵌套使用。
- 適配器模式:
將一個類的接口轉(zhuǎn)換為客戶希望的另一個接口.適配器模式讓那些不兼容的類可以一起工作。文章來源:http://www.zghlxwxcb.cn/news/detail-796957.html
好了,本次分享就到這里,歡迎大家繼續(xù)閱讀《設(shè)計模式》專欄其他設(shè)計模式內(nèi)容,如果有幫助到大家,歡迎大家點贊+關(guān)注+收藏,有疑問也歡迎大家評論留言!文章來源地址http://www.zghlxwxcb.cn/news/detail-796957.html
到了這里,關(guān)于適配器模式介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!