日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

适配器模式的三种形式

發布時間:2023/12/18 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 适配器模式的三种形式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

適配器模式,顧名思義,就是把原本不兼容的接口,通過適配,使之兼容。

舉個生活中簡單的例子,以前的手機內存卡可以取出來,但是想和電腦之間傳輸音樂、視頻等資料不能直接傳輸,需要通過USB讀卡器,然后插入USB接口就可以傳輸了,這個USB讀卡器就相當于適配器。

你經常使用的手機或電腦充電器,也屬于適配器,它將220V的交流電轉換為手機可用的直流電。下面,以手機充電器為例講解適配器模式。

適配器模式一般分為三類:類適配器模式、對象適配器模式、接口適配器模式(缺省適配器模式)

一、類適配器模式

一般手機充電器輸出的直流電壓為5V,我們把交流電220V稱為源,希望得到的直流電5V稱為目標,而充電器即為適配器。

//源,交流電 public class AC {public int outputAC(){return 220;} } //目標接口,直流電 public interface IDC {public int outputDC(); } //適配器 public class ClsAdapter extends AC implements IDC{@Overridepublic int outputDC() {return outputAC()/44; //直流電為交流電的電壓值除以44}public static void main(String[] args) {ClsAdapter adapter = new ClsAdapter();System.out.println("交流電電壓:" adapter.outputAC());System.out.println("直流電電壓:" adapter.outputDC());} }/** 輸出結果為: 交流電電壓:220 直流電電壓:5 */

可以看到,類適配器是通過繼承源類,實現目標接口的方式實現適配的。但是,由于Java單繼承的機制,這就要求目標必須是接口,有一定的局限性。

二、對象適配器模式

對象適配器,不是繼承源類,而是依據關聯關系,持有源類的對象,這也隱藏了源類的方法。在這里,適配器和源類的關系不是繼承關系,而是組合關系。

public class ObjAdapter implements IDC {//持有源類的對象private AC ac;public ObjAdapter(AC ac){this.ac = ac;}public int outputAC(){return ac.outputAC();}@Overridepublic int outputDC() {return ac.outputAC()/44;}public static void main(String[] args) {ObjAdapter adapter = new ObjAdapter(new AC());System.out.println("交流電電壓:" adapter.outputAC());System.out.println("直流電電壓:" adapter.outputDC());} } //輸出結果同上

三、接口適配器模式

設想,我現在的目標接口有多個方法,可以輸出5V,12V,20V的電壓。按照正常邏輯,設計一個適配器去實現這個接口,很顯然需要實現所有的方法。但是,實際使用中,其實只需要使用其中一個方法就可以了,比如我mac電腦直流電壓20V,只需要實現20V的方法就可以了。

因此,設計一個中間類去把目標接口的所有方法空實現,然后適配器類再去繼承這個中間類,選擇性重寫我所需要的方法,豈不是更好。代碼如下,

//目標接口,有多個方法 public interface IDCOutput {public int output5V();public int output12V();public int output20V(); } //中間類,空實現所有方法,這是一個抽象類 public abstract class DefaultAdapter implements IDCOutput {@Overridepublic int output5V() {return 0;}@Overridepublic int output12V() {return 0;}@Overridepublic int output20V() {return 0;} } //我的mac電源適配器只需要實現20V的方法即可 public class MacAdatper extends DefaultAdapter {private AC ac;public MacAdatper(AC ac){this.ac = ac;}@Overridepublic int output20V() {return ac.outputAC()/11;}public static void main(String[] args) {MacAdatper adatper = new MacAdatper(new AC());System.out.println("mac電腦電壓:" adatper.output20V());} } //輸出結果: //mac電腦電壓:20

至于為什么中間類使用抽象類,相信你看過我介紹的軟件六大設計原則,就明白了。它需要符合里氏替換原則(盡量基于抽象類和接口的繼承)。

不太明白接口適配模式的童鞋,建議看一下JDK里邊提供的一個鍵盤監聽適配器KeyAdapter,它就是一個抽象類,去空實現了KeyListener接口的所有方法。你就會感受到這種模式的奧妙。

總結:

  • 類適配器模式,繼承源類,實現目標接口。
  • 對象適配器模式,持有源類的對象,把繼承關系改變為組合關系。
  • 接口適配器模式,借助中間抽象類空實現目標接口所有方法,適配器選擇性重寫。
  • 三種模式,各有優缺點,可根據實際情況選擇使用。

    總結

    以上是生活随笔為你收集整理的适配器模式的三种形式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。