2022年1月30日 星期日

[Geroge]設計模式-適配器模式Adapter Pattern (下)

 2對象的適配器







與類的適配器模式一樣, 對象的適配器模式把被適配的淚的API轉換成為目標類的API, 與類的適配器模式不同的是, 對象的適配器模式不是使用繼承關係連接到Adaptee類, 而是使用委派關係連接到Adaptee的實例, 從而包裝類能夠把Adaptee的API與Target類的API銜接起來, Adapter與Adaptee是委派關係, 這決定了適配器模式是對象的(相當於Adapter把Adaptee當作成員, 並調用Adaptee做額外特別的處理)

例子:




有220V也有12V

我們將220V當作成員變數放在Adapter中

履行12V的方法, 並在其中呼叫220V並使用轉換














下面是運作類, 先New notbook, 再new Adapter將220V放入, 最後notebook使用Adapter 來turn on





下方是結果




對象與類適配器對比1

類適配器使用對象繼承方式, 是靜態的定義方式(啟動時動作)

對象適配器使用對象組合的方式, 是動態組合的方式(運作時動作)

對象與類適配器對比2

類適配器, 由於Adapter直接繼承Adaptee ,使得Adapter不能和Adaptee的子類一起工作, 因為繼承是靜態關係, 當Adapter繼承了Adaptee後, 就不可能去處理Adaptee的子類了

對象適配器, 一個Adapter可以把多種不同的源是配到同一個目標, 換言之, 同一個適配器可以把源類和它的子類都是配到目標接口, 因為對象適配器採用的是對象組合的關係, 只要對象類型正確, 是不是子類都無所謂

對象與類適配器對比3

類適配器, Adapter可以重新定義Adaptee的部分行為, 相當於子類可以覆蓋父類的部分實現方法

對象適配器, 要重新定義Adaptee的行為比較困難, 這種情況下, 需要定義Adaptee的子類來重新實現定義, 然後讓適配器組合子類, 雖然重定義Adaptee行為比較困難, 但是想要增加一些新的方法相當方便,而且新增行為可同時適用於所有的源

對象與類適配器對比4

對於類適配器, 僅僅引入了一個對象, 並不需要額外的引用來間接得到Adaptee

對於對象適配器, 需要而外的引用來間接得到Adaptee


使用建議:

建議盡量使用對象適配器的實現方式, 多用合成/聚合, 少用繼承, 當然具體問題具體分析, 根據需要來選擇實現方是, 最適合的才是最好的


適配器模式的優點:

更好的復用性: 系統需要使用現有的類, 而此類的介面不符合系統的需要, 那麼通過適配器模式就可以讓這些功能得到很好的復用

更好的擴展性: 在實現適配器功能的時候, 可以調用自己開發的功能, 從而自然地擴展系統的功能


適配器模式的缺點:

過多使用適配器, 會使系統非常凌亂, 不容易整體把握, 例如明明看到調用A介面, 但是內部被配適成B介面, 一個系統如果出現太多這種情況, 無疑是種災難, 因此如果不是必要, 可以不使用是珮配器, 而是直接對系統進行重構


實際使用場景:

一般是外部提供的庫, 或是包, 定義介面與方法不同於本系統內部定義的介面

為了不改變本系統內部調用的流程, 往往使用適配器模式來間容外部提供的褲或包

https://www.youtube.com/watch?v=cA-vt0Nf1nQ&list=PLGmd9-PCMLhb16ZxeSy00qUsBazXgJyfM&index=18

https://github.com/iw5420/geroge-design-pattern


沒有留言:

張貼留言

[leetcode] [KMP] KMP

ABCDABD... ABCDABF... 簡單的說, 傳統解兩字串匹配部分 可能會來個雙迴圈, 哀個比對, 當不匹配的時候, 會將下方列再後移1位 然後不匹配再後移 然而 如果像上放已經有4個屬於匹配的字串, 她就應該直接往後移四位來匹配, 而不是只移動1位 隱藏的思維是, 當...