适配器模式——类适配器模式,对象适配器模式
概述
如果去歐洲國家去旅游的話,他們的插座如下圖最左邊,是歐洲標準。
而我們使用的插頭如下圖最右邊的。因此我們的筆記本電腦,手機在當地不能直接充電。
所以就需要一個插座轉換器,轉換器第1面插入當地的插座,第2面供我們充電,這樣使得我們的插頭在當地能使用
生活中這樣的例子很多,手機充電器(將220v轉換為5v的電壓),讀卡器等,其實就是使用到了適配器模式。
定義:
將一個類的接口轉換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。
適配器模式分為類適配器模式和對象適配器模式,
前者類之間的耦合度比后者高,且要求程序員了解現有組件庫中的相關組件的內部結構,所以應用相對較少些。
5.2.2 結構
適配器模式(Adapter)包含以下主要角色:
- 目標(Target)接口:當前系統業務所期待的接口,它可以是抽象類或接口。
- 適配者(Adaptee)類:它是被訪問和適配的現存組件庫中的組件接口。
- 適配器(Adapter)類:它是一個轉換器,通過繼承或引用適配者的對象,把適配者接口轉換成目標接口,讓客戶按目標接口的格式訪問適配者。
5.2.3 類適配器模式
實現方式:定義一個適配器類來實現當前系統的業務接口,同時又繼承現有組件庫中已經存在的組件。
【例】讀卡器
現有一臺電腦只能讀取SD卡,而要讀取TF卡中的內容的話就需要使用到適配器模式。創建一個讀卡器,將TF卡中的內容讀取出來。
類圖如下:
SDCard.java
package com.itheima.pattern.adapter.class_adapter;/*** @version v1.0* @ClassName: SDCard* @Description: 目標接口* @Author: dym*/ public interface SDCard {//從SD卡中讀取數據String readSD();//往SD卡中寫數據void writeSD(String msg); }SDCardImpl.java
package com.itheima.pattern.adapter.class_adapter;/*** @version v1.0* @ClassName: SDCardImpl* @Description: 具體的SD卡* @Author: dym*/ public class SDCardImpl implements SDCard {public String readSD() {String msg = "SDCard read msg : hello word SD";return msg;}public void writeSD(String msg) {System.out.println("SDCard write msg :" + msg);} }TFCard.java
package com.itheima.pattern.adapter.class_adapter;/*** @version v1.0* @ClassName: TFCard* @Description: 適配者類的接口* @Author: dym*/ public interface TFCard {//從TF卡中讀取數據String readTF();//往TF卡中寫數據void writeTF(String msg); }TFCardImpl.java
package com.itheima.pattern.adapter.class_adapter;/*** @version v1.0* @ClassName: TFCardImpl* @Description: 適配者類* @Author: dym*/ public class TFCardImpl implements TFCard {public String readTF() {String msg = "TFCard read msg : hello word TFcard";return msg;}public void writeTF(String msg) {System.out.println("TFCard write msg :" + msg);} }SDAdapterTF.java
package com.itheima.pattern.adapter.class_adapter;/*** @version v1.0* @ClassName: SDAdapterTF* @Description: 適配器類* @Author: dym*/ public class SDAdapterTF extends TFCardImpl implements SDCard {public String readSD() {System.out.println("adapter read tf card");return readTF();}public void writeSD(String msg) {System.out.println("adapter write tf card");writeTF(msg);} }Computer.java
package com.itheima.pattern.adapter.class_adapter;/*** @version v1.0* @ClassName: Computer* @Description: 計算機類* @Author: dym*/ public class Computer {//從SD卡中讀取數據public String readSD(SDCard sdCard) {if(sdCard == null) {throw new NullPointerException("sd card is not null");}return sdCard.readSD();} }Client.java
package com.itheima.pattern.adapter.class_adapter;/*** @version v1.0* @ClassName: Client* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class Client {public static void main(String[] args) {//創建計算機對象Computer computer = new Computer();//讀取SD卡中的數據String msg = computer.readSD(new SDCardImpl());System.out.println(msg);System.out.println("===============");//使用該電腦讀取TF卡中的數據//定義適配器類String msg1 = computer.readSD(new SDAdapterTF());System.out.println(msg1);} }類適配器模式違背了合成復用原則。
類適配器是客戶類有一個接口規范的情況下可用,反之不可用。
對象適配器模式
實現方式:對象適配器模式可釆用將現有組件庫中已經實現的組件引入適配器類中,該類同時實現當前系統的業務接口。
【例】讀卡器
我們使用對象適配器模式將讀卡器的案例進行改寫。類圖如下:
代碼如下:
類適配器模式的代碼,我們只需要修改適配器類(SDAdapterTF)和測試類。
?
SDCard.java
package com.itheima.pattern.adapter.object_adapter;/*** @version v1.0* @ClassName: SDCard* @Description: 目標接口* @Author: dym*/ public interface SDCard {//從SD卡中讀取數據String readSD();//往SD卡中寫數據void writeSD(String msg); }SDCardImpl.java
package com.itheima.pattern.adapter.object_adapter;/*** @version v1.0* @ClassName: SDCardImpl* @Description: 具體的SD卡* @Author: dym*/ public class SDCardImpl implements SDCard {public String readSD() {String msg = "SDCard read msg : hello word SD";return msg;}public void writeSD(String msg) {System.out.println("SDCard write msg :" + msg);} }TFCard.java
package com.itheima.pattern.adapter.object_adapter;/*** @version v1.0* @ClassName: TFCard* @Description: 適配者類的接口* @Author: dym*/ public interface TFCard {//從TF卡中讀取數據String readTF();//往TF卡中寫數據void writeTF(String msg); }TFCardImpl.java
package com.itheima.pattern.adapter.object_adapter;/*** @version v1.0* @ClassName: TFCardImpl* @Description: 適配者類* @Author: dym*/ public class TFCardImpl implements TFCard {public String readTF() {String msg = "TFCard read msg : hello word TFcard";return msg;}public void writeTF(String msg) {System.out.println("TFCard write msg :" + msg);} }SDAdapterTF.java
package com.itheima.pattern.adapter.object_adapter;/*** @version v1.0* @ClassName: SDAdapterTF* @Description: 適配器類* @Author: dym*/ public class SDAdapterTF implements SDCard {//聲明適配者類private TFCard tfCard;public SDAdapterTF(TFCard tfCard) {this.tfCard = tfCard;}public String readSD() {System.out.println("adapter read tf card");return tfCard.readTF();}public void writeSD(String msg) {System.out.println("adapter write tf card");tfCard.writeTF(msg);} }Computer.java
package com.itheima.pattern.adapter.object_adapter;/*** @version v1.0* @ClassName: Computer* @Description: 計算機類* @Author: dym*/ public class Computer {//從SD卡中讀取數據public String readSD(SDCard sdCard) {if(sdCard == null) {throw new NullPointerException("sd card is not null");}return sdCard.readSD();} }Client.java
package com.itheima.pattern.adapter.object_adapter;/*** @version v1.0* @ClassName: Client* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class Client {public static void main(String[] args) {//創建計算機對象Computer computer = new Computer();//讀取SD卡中的數據String msg = computer.readSD(new SDCardImpl());System.out.println(msg);System.out.println("===============");//使用該電腦讀取TF卡中的數據//創建適配器類對象SDAdapterTF sdAdapterTF = new SDAdapterTF(new TFCardImpl());String msg1 = computer.readSD(sdAdapterTF);System.out.println(msg1);} }注意:還有一個適配器模式是接口適配器模式。
? ? ? ? ? ?當不希望實現一個接口中所有的方法時,可以創建一個抽象類Adapter ,實現所有方法。
? ? ? ? ? ?而此時我們只需要繼承該抽象類即可。
應用場景
- 以前開發的系統存在滿足新系統功能需求的類,但其接口同新系統的接口不一致。
- 使用第三方提供的組件,但組件接口定義和自己要求的接口定義不同。
總結
以上是生活随笔為你收集整理的适配器模式——类适配器模式,对象适配器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代理模式——静态代理,动态代理(JDK代
- 下一篇: JDK源码解析 —— IO流中的包装类使