91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Adapter適配器模式怎么應用

發布時間:2022-03-23 10:57:06 來源:億速云 閱讀:157 作者:iii 欄目:web開發

這篇文章主要講解了“Adapter適配器模式怎么應用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Adapter適配器模式怎么應用”吧!

Adapter(適配器模式)

Adapter(適配器模式)屬于結構型模式,別名 wrapper,結構性模式關注的是如何組合類與對象,以獲得更大的結構,我們平常工作大部分時間都在與這種設計模式打交道。

意圖:將一個類的接口轉換成客戶希望的另一個接口。Adapter 模式使得原本由于接口不兼容而不能在一起工作的那些類可以一起工作。

這個設計模式的意圖很好懂,就是把接口不兼容問題抹平。注意,也僅僅能解決接口不一致的問題,而不能解決功能不一致的問題。

舉例子

如果看不懂上面的意圖介紹,沒有關系,設計模式需要在日常工作里用起來,結合例子可以加深你的理解,下面我準備了三個例子,讓你體會什么場景下會用到這種設計模式。

接口轉換器

插座的種類很多,我們都用過許多適配器,將不同的插頭進行轉換,可以在不替換插座的情況下正常使用。

USB 接口轉換也同樣精彩,有將 TypeC 接口轉換為 TypeA 的,也有將 TypeA 接口轉換為 TypeC 的,支持雙向轉換。

接口轉換器就是我們在生活中使用到的適配器模式,因為廠商并沒有生產一個新的插座,我們也沒有因為接口不適配而換一個手機,一切只需要一個接口轉換器即可,這就是運用設計模式的收益。

數據庫 ORM

ORM 屏蔽了 SQL 這一層,帶來的好處是不需要理解不同 SQL 語法之間的區別,對于通用功能,ORM 會根據不同的平臺,比如 Postgresql、Mysql 進行 SQL 的轉換。

對 ORM 來說,屏蔽不同平臺的差異,就是利用適配器模式做到的。

API Deprecated

當一個廣泛使用的庫進行了含有 break change 的升級時,往往要留給開發者足夠的時間去升級,而不能升級后就直接掛掉,因此被廢棄的 API 要標記為 deprecated,而這種被廢棄標記的 API 的實際實現,往往是使用新的 API 替代,這種場景正是使用了適配器模式,將新的 API 適配到舊的 API,實現 API Deprecated。

意圖解釋

上面三個例子都滿足下面兩個條件:

API 不兼容:因為接口的不同;數據庫 SQL 語法的不同;框架 API 的不同。

但能力已支持:插座都擁有充電或讀取能力;不同的 SQL 都擁有查詢數據庫能力;新 API 覆蓋了舊 API 的能力。

這樣就可以通過適配器滿足 Adapter 的意圖:

意圖:將一個類的接口轉換成客戶希望的另一個接口。Adapter 模式使得原本由于接口不兼容而不能在一起工作的那些類可以一起工作。

結構圖

適配器的實現分為繼承與組合模式。

下面是名詞解釋:

Adapter 適配器,把 Adeptee 適配成 Target。

Adaptee 被適配的內容,比如不兼容的接口。

Target 適配為的內容,比如需要用的接口。

繼承:

適配器繼承 Adaptee 并實現 Target,適用場景是 Adaptee 與 Target 結構類似的情況,因為這樣只需要實現部分差異化即可。

組合:

組合的拓展性更強,但工作量更大,如果 Target 與 Adaptee 結構差異較大,適合用組合模式。

代碼例子

下面例子使用 typescript 編寫。

繼承:

interface ITarget {

  // 標準方式是 hello

  hello: () => void

}

class Adaptee {

  // 要被適配的類方法叫 sayHello

  sayHello() {

    console.log('hello')

  }

}

// 適配器繼承 Adaptee 并實現 ITarget

class Adapter extends Adaptee implements ITarget {

  hello() {

    // 用 sayHello 對接到 hello

    super.sayHello()

  }

}

組合:

interface ITarget {

  // 標準方式是 hello

  hello: () => void

}

class Adaptee {

  // 要被適配的類方法叫 sayHello

  sayHello() {

    console.log('hello')

  }

}

// 適配器繼承 Adaptee 并實現 ITarget

class Adapter implements ITarget {

  private adaptee: Adaptee 

  constructor(adaptee: Adaptee) {

    this.adaptee = adaptee

  }

  hello() {

    // 用 adaptee.sayHello 對接到 hello

    this.adaptee.sayHello()

  }

}

弊端

使用適配器模式本身就可能是個問題,因為一個好的系統內部不應該做任何僑界,模型應該保持一致性。只有在如下情況才考慮使用適配器模式:

新老系統接替,改造成本非常高。

三方包適配。

新舊 API 兼容。

統一多個類的接口。一般可以結合工廠方法使用。

感謝各位的閱讀,以上就是“Adapter適配器模式怎么應用”的內容了,經過本文的學習后,相信大家對Adapter適配器模式怎么應用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹿邑县| 隆昌县| 永州市| 镶黄旗| 呼图壁县| 闵行区| 黎川县| 合水县| 启东市| 雅安市| 行唐县| 辽宁省| 茶陵县| 澄江县| 民勤县| 德令哈市| 大余县| 南岸区| 清新县| 沐川县| 江永县| 漳州市| 通化县| 临夏县| 高州市| 奉化市| 普兰县| 云梦县| 怀安县| 亚东县| 明光市| 灵山县| 沙湾县| 微山县| 阳江市| 深水埗区| 泌阳县| 贞丰县| 青河县| 土默特右旗| 平邑县|