適配器設計模式

一、適配器模式app

  • 把一個類的接口變換成客戶端所期待的另外一種接口
  • 使本來因接口不匹配而沒法在一塊兒工做的兩個類可以在一塊兒工做
  • 分爲類的適配器模式對象的適配器模式

二、類適配器模式對象

類的適配器模式把適配的類的API轉換成爲目標類的APIblog

  • 目標(Target)角色:所期待獲得的接口。注意:因爲這裏討論的是類適配器模式,所以目標不能夠是類
  • 源(Adapee)角色:須要適配的接口
  • 適配器(Adaper)角色:適配器類是本模式的核心。適配器把源接口轉換成目標接口。顯然,這一角色不能夠是接口,而必須是具體類

  • 客戶端使用的時候,可使用Target 接口,接Adapter實例 

三、對象適配器模式繼承

  • 對象的適配器模式把被適配的類的API轉換成爲目標類的API

與類的適配器模式不一樣的是接口

  • 對象的適配器模式不是使用繼承關係鏈接到Adaptee類,而是使用委派關係鏈接到Adaptee類

  • 提供一個包裝(Wrapper)類Adapter
  • Adapter與Adaptee是委派關係,這決定了適配器模式是對象的

四、類適配器和對象適配器的權衡開發

(1)類適配器使用對象繼承的方式,是靜態的定義方式get

  • 對象適配器使用對象組合的方式,是動態組合的方式

(2)對於類適配器擴展

  • 因爲適配器直接繼承了Adaptee,使得適配器不能和Adaptee的子類一塊兒工做
  • 由於繼承是靜態的關係,當適配器繼承了Adaptee後,就不可能再去處理  Adaptee的子類了

對於對象適配器重構

  • 一個適配器能夠把多種不一樣的源適配到同一個目標
  • 換言之,同一個適配器能夠把源類和它的子類都適配到目標接口
  • 由於對象適配器採用的是對象組合的關係,只要對象類型正確,是否是子類都無所謂

(3)對於類適配器引用

  • 適配器能夠重定義Adaptee的部分行爲,至關於子類覆蓋父類的部分實現方法

對於對象適配器

  • 要重定義Adaptee的行爲比較困難
  • 這種狀況下,須要定義Adaptee的子類來實現重定義,而後讓適配器組合子類
  • 雖然重定義Adaptee的行爲比較困難,可是想要增長一些新的行爲則方便的很,並且新增長的行爲可同時適用於全部的源

(4)對於類適配器,僅僅引入了一個對象,並不須要額外的引用來間接獲得Adaptee

對於對象適配器

  • 須要額外的引用來間接獲得Adaptee
  • 建議儘可能使用對象適配器的實現方式,多用合成/聚合、少用繼承
  • 固然,具體問題具體分析,根據須要來選用實現方式,最適合的纔是最好的

五、適配器模式的優勢

更好的複用性

  • 系統須要使用現有的類,而此類的接口不符合系統的須要
  • 那麼經過適配器模式就可讓這些功能獲得更好的複用

更好的擴展性

  • 在實現適配器功能的時候,能夠調用本身開發的功能,從而天然地擴展系統的功能

六、適配器模式的缺點

  • 過多的使用適配器,會讓系統很是零亂,不易總體進行把握
  • 所以若是不是頗有必要,能夠不使用適配器,而是直接對系統進行重構

七、缺省適配模式

  • 爲一個接口提供缺省實現,這樣子類型能夠從這個缺省實現進行擴展,而沒必要從原有接口進行擴展
  • 做爲適配器模式的一個特例,缺省是適配模式在JAVA語言中有着特殊的應用

適配器模式的用意

  • 要改變源的接口,以便於目標接口相容

缺省適配的用意稍有不一樣

  • 它是爲了方便創建一個不平庸的適配器類而提供的一種平庸實現
  • 在任什麼時候候,若是不許備實現一個接口的全部方法時,就可使用「缺省適配模式」製造一個抽象類,給出全部方法的平庸的具體實現
  • 這樣,從這個抽象類再繼承下去的子類就沒必要實現全部的方法了
相關文章
相關標籤/搜索