定義
? ? ? ? Adapter Partern:?將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
場景
-
系統需要使用現有的類,而這些類的接口不符合系統的需要。
-
典型場景:集成第三方庫、遺留系統代碼或外部組件。你不想(或不能)修改別人的代碼,但你的系統接口標準又和它們不一樣。
-
-
想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的類(包括可能在將來引進的類)一起工作。
-
適配器可以作為一個中間層,將未來可能引入的新組件也適配到現有系統中。
-
-
需要一個統一的輸出接口,而輸入端的類型不可預知或多樣化。
-
例如,一個文件處理器可能需要處理來自磁盤、網絡、數據庫等各種來源的數據,但它們提供的讀取接口各不相同。可以為每種來源創建一個適配器,讓處理器用統一的接口讀取數據。
-
Java場景
-
Java IO 流
-
InputStreamReader
?和?OutputStreamWriter
?就是經典的適配器。 -
InputStreamReader
?將基于字節的?InputStream
?適配為基于字符的?Reader
?接口。 -
java.io.InputStreamReader(InputStream in)
?// 適配器構造函數,接收一個InputStream -
java.io.OutputStreamWriter(OutputStream out)
?// 適配器構造函數,接收一個OutputStream
-
-
Java 集合框架
-
Arrays.asList(T[] a)
?方法將一個數組適配成一個?List
?接口。你不能再添加或刪除元素,但可以使用?List
?的所有其他方法來操作數組元素。
-
-
Java AWT / Swing 事件處理
-
早期常用
WindowAdapter
等適配器類(通常是抽象類,提供空實現)。它們是為了簡化事件監聽器接口的創建,屬于一種“缺省適配器”模式,是適配器模式的一種變體。 -
例如,
MouseAdapter
?實現了?MouseListener
?接口,但所有方法都是空實現。你可以只重寫你關心的?mouseClicked
?方法,而不必實現所有5個方法。
-
-
Spring Framework
-
Spring MVC 中的?
HandlerAdapter
?是核心組件之一。DispatcherServlet 并不直接處理各種Controller(如?@Controller
,?HttpRequestHandler
,?Controller
?接口實現類等),而是通過?HandlerAdapter
?來調用。不同的Controller由不同的適配器來處理,從而屏蔽了Controller的多樣性。
-
代碼
// 1. 目標接口 (Target Interface) - 美標插座
interface ISocket {void supplyPower(); // 提供電力
}// 2. 被適配者 (Adaptee) - 中標插頭
class ChinesePlug {public void connect() {System.out.println("中國插頭已連接,開始供電...");}
}// 3. 適配器 (Adapter) - 轉換插頭 (對象適配器,使用組合)
class SocketAdapter implements ISocket {// 持有被適配對象的引用private ChinesePlug chinesePlug;public SocketAdapter(ChinesePlug chinesePlug) {this.chinesePlug = chinesePlug;}@Overridepublic void supplyPower() {// 調用被適配對象的方法,進行轉換System.out.print("[適配器工作] 將美標接口轉換為中標接口 -> ");chinesePlug.connect(); // 本質調用的是被適配的方法}
}// 4. 客戶端 (Client)class AdapterPatternDemo {public static void main(String[] args) {// 我有一個中標插頭的電器ChinesePlug myPlug = new ChinesePlug();// 我在美國,墻上只有美標插座(ISocket),插不進去// 我買了一個轉換插頭(適配器)ISocket adapter = new SocketAdapter(myPlug);// 現在我可以把轉換插頭插到墻上的美標插座了// 客戶端始終只和目標接口ISocket打交道adapter.supplyPower();}
}
適配器模式代碼