适配器模式——类适配器模式,对象适配器模式
概述
如果去歐洲國家去旅游的話,他們的插座如下圖最左邊,是歐洲標(biāo)準(zhǔn)。
而我們使用的插頭如下圖最右邊的。因此我們的筆記本電腦,手機(jī)在當(dāng)?shù)夭荒苤苯映潆姟?/p>
所以就需要一個插座轉(zhuǎn)換器,轉(zhuǎn)換器第1面插入當(dāng)?shù)氐牟遄?#xff0c;第2面供我們充電,這樣使得我們的插頭在當(dāng)?shù)啬苁褂?/p>
生活中這樣的例子很多,手機(jī)充電器(將220v轉(zhuǎn)換為5v的電壓),讀卡器等,其實就是使用到了適配器模式。
定義:
將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。
適配器模式分為類適配器模式和對象適配器模式,
前者類之間的耦合度比后者高,且要求程序員了解現(xiàn)有組件庫中的相關(guān)組件的內(nèi)部結(jié)構(gòu),所以應(yīng)用相對較少些。
5.2.2 結(jié)構(gòu)
適配器模式(Adapter)包含以下主要角色:
- 目標(biāo)(Target)接口:當(dāng)前系統(tǒng)業(yè)務(wù)所期待的接口,它可以是抽象類或接口。
- 適配者(Adaptee)類:它是被訪問和適配的現(xiàn)存組件庫中的組件接口。
- 適配器(Adapter)類:它是一個轉(zhuǎn)換器,通過繼承或引用適配者的對象,把適配者接口轉(zhuǎn)換成目標(biāo)接口,讓客戶按目標(biāo)接口的格式訪問適配者。
5.2.3 類適配器模式
實現(xiàn)方式:定義一個適配器類來實現(xiàn)當(dāng)前系統(tǒng)的業(yè)務(wù)接口,同時又繼承現(xiàn)有組件庫中已經(jīng)存在的組件。
【例】讀卡器
現(xiàn)有一臺電腦只能讀取SD卡,而要讀取TF卡中的內(nèi)容的話就需要使用到適配器模式。創(chuàng)建一個讀卡器,將TF卡中的內(nèi)容讀取出來。
類圖如下:
SDCard.java
package com.itheima.pattern.adapter.class_adapter;/*** @version v1.0* @ClassName: SDCard* @Description: 目標(biāo)接口* @Author: dym*/ public interface SDCard {//從SD卡中讀取數(shù)據(jù)String readSD();//往SD卡中寫數(shù)據(jù)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卡中讀取數(shù)據(jù)String readTF();//往TF卡中寫數(shù)據(jù)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: 計算機(jī)類* @Author: dym*/ public class Computer {//從SD卡中讀取數(shù)據(jù)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) {//創(chuàng)建計算機(jī)對象Computer computer = new Computer();//讀取SD卡中的數(shù)據(jù)String msg = computer.readSD(new SDCardImpl());System.out.println(msg);System.out.println("===============");//使用該電腦讀取TF卡中的數(shù)據(jù)//定義適配器類String msg1 = computer.readSD(new SDAdapterTF());System.out.println(msg1);} }類適配器模式違背了合成復(fù)用原則。
類適配器是客戶類有一個接口規(guī)范的情況下可用,反之不可用。
對象適配器模式
實現(xiàn)方式:對象適配器模式可釆用將現(xiàn)有組件庫中已經(jīng)實現(xiàn)的組件引入適配器類中,該類同時實現(xiàn)當(dāng)前系統(tǒng)的業(yè)務(wù)接口。
【例】讀卡器
我們使用對象適配器模式將讀卡器的案例進(jìn)行改寫。類圖如下:
代碼如下:
類適配器模式的代碼,我們只需要修改適配器類(SDAdapterTF)和測試類。
?
SDCard.java
package com.itheima.pattern.adapter.object_adapter;/*** @version v1.0* @ClassName: SDCard* @Description: 目標(biāo)接口* @Author: dym*/ public interface SDCard {//從SD卡中讀取數(shù)據(jù)String readSD();//往SD卡中寫數(shù)據(jù)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卡中讀取數(shù)據(jù)String readTF();//往TF卡中寫數(shù)據(jù)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: 計算機(jī)類* @Author: dym*/ public class Computer {//從SD卡中讀取數(shù)據(jù)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) {//創(chuàng)建計算機(jī)對象Computer computer = new Computer();//讀取SD卡中的數(shù)據(jù)String msg = computer.readSD(new SDCardImpl());System.out.println(msg);System.out.println("===============");//使用該電腦讀取TF卡中的數(shù)據(jù)//創(chuàng)建適配器類對象SDAdapterTF sdAdapterTF = new SDAdapterTF(new TFCardImpl());String msg1 = computer.readSD(sdAdapterTF);System.out.println(msg1);} }注意:還有一個適配器模式是接口適配器模式。
? ? ? ? ? ?當(dāng)不希望實現(xiàn)一個接口中所有的方法時,可以創(chuàng)建一個抽象類Adapter ,實現(xiàn)所有方法。
? ? ? ? ? ?而此時我們只需要繼承該抽象類即可。
應(yīng)用場景
- 以前開發(fā)的系統(tǒng)存在滿足新系統(tǒng)功能需求的類,但其接口同新系統(tǒng)的接口不一致。
- 使用第三方提供的組件,但組件接口定義和自己要求的接口定義不同。
總結(jié)
以上是生活随笔為你收集整理的适配器模式——类适配器模式,对象适配器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代理模式——静态代理,动态代理(JDK代
- 下一篇: JDK源码解析 —— IO流中的包装类使