做wish選品網(wǎng)站 數(shù)據(jù)網(wǎng)站湖南平臺網(wǎng)站建設(shè)制作
介紹
適配器模式(Adapter Pattern)是一種結(jié)構(gòu)型設(shè)計模式,它允許接口不兼容的類可以協(xié)同工作,通過將一個類的接口轉(zhuǎn)換成客戶端所期望的另一個接口,使得原本由于接口不兼容而不能一起工作的類可以一起工作。
1.定義
適配器模式將一個類的接口轉(zhuǎn)換成客戶期望的另一個接口,使得原本接口不兼容而無法一起工作的類可以一起工作。
2. 主要作用
- 接口兼容:使得兩個不兼容的接口能夠工作在一起。
- 解耦:通過適配器將客戶端與被適配者解耦,減少了系統(tǒng)的耦合性。
- 重用性:允許現(xiàn)有的類在不修改的情況下被復用,提高了代碼的重用性。
3. 解決的問題
- 當現(xiàn)有類的接口和需求的接口不兼容時,適配器模式可以將現(xiàn)有接口轉(zhuǎn)換成所需接口。
- 在不修改現(xiàn)有類的前提下,使其能夠適應新的接口需求,充分復用現(xiàn)有代碼。
4. 模式原理
包含角色:
- Target(目標接口): 客戶端期望的接口。
- Adapter(適配器): 實現(xiàn)了目標接口,并且持有一個被適配對象的實例。
- Adaptee(被適配的類): 原本存在的接口或類。
UML類圖:
代碼示例:
// 目標接口
interface Printer {void print(String content);
}// 舊類(不兼容的接口)
class OldPrinter {void printText(String text) {System.out.println("OldPrinter: " + text);}
}// 適配器類
class PrinterAdapter implements Printer {private OldPrinter oldPrinter;public PrinterAdapter(OldPrinter oldPrinter) {this.oldPrinter = oldPrinter;}@Overridepublic void print(String content) {// 在適配器中處理圖像打印的邏輯String textContent = convertImageToText(content);oldPrinter.printText(textContent);}// 假設(shè)這是一個將圖像轉(zhuǎn)換為文本的方法private String convertImageToText(String image) {return "Converted Image: " + image;}
}
調(diào)用
public class AdapterPatternDemo {public static void main(String[] args) {OldPrinter oldPrinter = new OldPrinter();Printer printerAdapter = new PrinterAdapter(oldPrinter);// 客戶端使用適配器打印圖像printerAdapter.print("SampleImage.jpg");}
}
打印輸出
OldPrinter: Converted Image: SampleImage.jpg
適配器在我們的生活中無處不在,幫助不同系統(tǒng)、設(shè)備和協(xié)議之間實現(xiàn)兼容與互通比如電源適配器,耳機適配器,家用電器的轉(zhuǎn)換插頭,文件格式轉(zhuǎn)換等等…
正如你想的那樣,將一種不可使用的東西,通過一系列適配達到可用狀態(tài),這就是適配器模式的含義。
在Java中InputStreamReader
可以被視為適配器,將字節(jié)流(InputStream
)轉(zhuǎn)換為字符流(Reader
)
InputStream inputStream = new FileInputStream("xxx.txt");
Reader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
Java的集合框架中,Collections
類提供了多個適配器方法,例如ListIterator
。它允許對List集合進行雙向迭代。
List<String> list = new ArrayList<>();ListIterator<String> iterator = list.listIterator();while (iterator.hasNext()) {System.out.println(iterator.next());}
在安卓中,適配器的含義是將數(shù)據(jù)轉(zhuǎn)化成UI顯示出來。例如RecyclerView.Adapter
是一個典型的適配器模式示例。RecyclerView
本身并不知道數(shù)據(jù)的來源,適配器充當了RecyclerView
和數(shù)據(jù)之間的橋梁。
其實適配器真沒啥介紹的,大家已經(jīng)熟悉的不能再熟悉了,此篇文章就當用來幫助大家加固下對適配器模式的印象吧!😜
5. 優(yōu)缺點
優(yōu)點:
- 單一職責原則:將接口轉(zhuǎn)換代碼封裝在適配器中,不需要修改原有類。
- 開閉原則:添加新的適配器,不需要修改已有代碼。
- 提高復用性:可以復用現(xiàn)有類,減少代碼重復。
缺點:
- 復雜性增加:引入適配器模式會增加系統(tǒng)的復雜性,增加了額外的類。
- 類適配器的局限性:類適配器使用多重繼承,可能不適用于所有面向?qū)ο笳Z言(如Java只支持單繼承)。
6. 應用場景
- 需要與不兼容的接口或類庫進行集成。
- 需要使用現(xiàn)有類的功能,但它們的接口不符合客戶端的要求。
- 在系統(tǒng)中需要將多個不同的接口統(tǒng)一為一個接口。
7. 對象適配器(Object Adapter)和類適配器(Class Adapter)區(qū)別
特性 | 類適配器(Class Adapter) | 對象適配器(Object Adapter) |
---|---|---|
實現(xiàn)方式 | 通過繼承(類) | 通過組合(對象) |
適配方式 | 編譯時適配 | 運行時適配 |
靈活性 | 不夠靈活,適配關(guān)系固定 | 靈活,適配對象可以在運行時更改 |
對變化的影響 | 被適配類變化影響較大 | 被適配類變化影響較小 |
8. 總結(jié)
適配器模式是一種結(jié)構(gòu)型設(shè)計模式,通過將一個類的接口轉(zhuǎn)換為客戶端期望的接口,使得原本不兼容的類可以一起工作。它主要解決接口不兼容的問題,提高代碼的復用性和靈活性。雖然引入了額外的復雜性,但它在需要復用現(xiàn)有代碼,或者在不修改源代碼的前提下適應新接口需求的場景下,非常有用。適配器模式有類適配器和對象適配器兩種實現(xiàn)方式,各自有優(yōu)缺點,選擇時應根據(jù)具體需求和語言特性來決定。