日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

设计模式 之 适配器模式

發布時間:2025/6/15 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 之 适配器模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目的

將一個類的接口轉換為另一個符合客戶期望的接口

達到的目的:

種類

有兩種:

  • 對象適配器
  • [ ] 類適配器(嗷~~暫時沒有實際場景讓自己完全明白嗷?)
  • NOTE: 對象適配器和類適配器使用兩種不同的適配方法(分別是組合委托和繼承)

舉個例子

我這里就拿使用三腳插頭充電的蘋果手機(港版充電器)來舉個例子吧~和圖中例子相反

interface IPhoneCharger {chargeWith3Footer(): void; }// Target interface PrimaryCharger {chargeWith2Footer(): void; }// adaptee // 蘋果手機實現蘋果手機充電器接口 class IPhone implements IPhoneCharger {chargeWith3Footer() {console.log("蘋果手機開始充電啦~~~?")} }// adapter // 普通充電器適配器 - 實現普通充電器接口 - 使蘋果手機等其他充電器可以適配普通2腳充電器進行充電 class PrimaryChargerAdapter implements PrimaryCharger {private phone: any;constructor(phone: any) {this.phone = phone;}chargeWith2Footer(): void {if (this.phone.constructor === IPhone) {// 適配器在這里適配三腳和二腳充電器接口this.phone.chargeWith3Footer();}} }function TestDemo() {const iPhone = new IPhone();// iPhone.chargeWith2Foot(); // will fail// 中國大陸一般都是2插口插座~需要使用2腳充電器充電 chargeWith2Footer(),// 但是蘋果手機是三腳充電器不支持~~// 通過充電器適配器,實現了chargeWith2Footer(),符合客戶期望的接口~~~const adaptedIPhone = new PrimaryChargerAdapter(iPhone);adaptedIPhone.chargeWith2Footer(); // 完美~~ }TestDemo();
  • 在線測試

對號入座

Java中的適配器

客戶使用適配器的過程解析:

  • 客戶通過目標接口調用適配器的方法對適配器發起請求
  • 適配器使用被適配者接口把請求換成被適配者的一個或多個調用接口
  • 客戶收到調用的結果,但未察覺一切是適配器的轉換作用。
  • // 改造成ts形式~~ class OldClassAdapter implements NewInterface {private OldClass ref;constructor(OldClass oc) {this.ref = oc;}public NewMethod(): void {this.ref.OldMethod();} }
    • 或許結合這一段代碼就可以更加理解適配器模式使用的場景

    思考 ?

    • 我所認為的適配器模式應該盡量不去修改被適配者。
    • 真正想做的是應該是接口的轉換。

    優點

    對象適配器模式優點:
    (1) 一個對象適配器可以把多個不同的適配者適配到同一個目標;
    (2) 將目標類和被適配者類解耦,通過引入一個適配器類來重用現有的被適配者類,無須修改原有結構。

    缺點

    過多的使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現.

    適配器模式 VS 外觀模式

    先看下面這段熟悉的代碼~~ 摘自 @遠峰

    // 統一的接口適配不同類 // Target 客戶期望使用的接口 interface ComputerInterface {usb(): void; }// Adaptee class HuaweiPhone {huaweiInterface(): void {console.log('華為手機的數據接口');} }// Adaptee class Iphone {iphoneInterface(): void {console.log('蘋果手機的數據接口');} }// Class Adapter class HuaweiDataWireAdapter extends HuaweiPhone implements ComputerInterface {usb(): void {console.log('使用華為數據線連接');super.huaweiInterface();} }class IphoneDataWireAdapter extends Iphone implements ComputerInterface {usb(): void {console.log('使用蘋果數據線連接');super.iphoneInterface();} }function commonAdapterDemo() {const computer1 = new HuaweiDataWireAdapter();computer1.usb();const computer2 = new IphoneDataWireAdapter();computer2.usb();} commonAdapterDemo();
    • 有些誤解就是一個適配器只用來適配一個類,但其實適配器模式也可以包裝多個類。
    • 這個例子就是一個類適配器的應用。客戶期望使用他們自己的數據線連接 ~.usb(),然后通過適配器做了一個轉換,事實上沒有說將華為手機和蘋果手機的數據線接口給重新設計了~
    • [ ] 相類似的是外觀模式,還沒思考(? 狗帶了)

    NOTE: 外觀和適配器模式都可以包裝許多類,但是外觀模式是為了簡化操作,而適配器模式是將接口轉換為不同接口

    Q & A

    • 一個適配器需要做多少“適配”工作?
      適配器做的工作和目標接口的大小成正比

    參考資料

    • Head First 設計模式
    • 原文鏈接

    總結

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

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