您好,登錄后才能下訂單哦!
這篇文章主要介紹“使用Adapter模式時需要考慮哪些因素”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“使用Adapter模式時需要考慮哪些因素”文章能幫助大家解決問題。
效果
類適配器和對象適配器有不同的權衡。類適配器
? 用一個具體的Adapter類對Adaptee和Target進行匹配。結果是當我們想要匹配一個類以及所有它的子類時,類Adapter將不能勝任工作。
這是類適配器的缺點。
? 使得Adapter可以重定義Adaptee的部分行為,因為Adapter是Adaptee的一個子類。
作為派生類,可以很簡單地修改基類的行為并直接被Adapter適用。
? 僅僅引入了一個對象,并不需要額外的指針以間接得到adaptee。
比對象適配器少占一個指針變量的空間,并且不需要另外建立Adapter和Adaptee之間的關系。
對象適配器則
? 允許一個Adapter與多個Adaptee—即Adaptee本身以及它的所有子類(如果有子類的話)—同時工作。Adapter也可以一次給所有的Adaptee添加功能。
這是很方便的!
? 使得重定義Adaptee的行為比較困難。這就需要生成 Adaptee的子類并且使得Adapter引用這個子類而不是引用Adaptee本身。
需要替換Adapter引用的Adaptee對象。
相比較而言,對象適配器多用一個指針變量,多一些程序性的操作獲得了更大的靈活性。作者推薦對象適配器。
使用Adapter模式時需要考慮的其他一些因素有:
1) Adapter的匹配程度
對Adaptee的接口與Target的接口進行匹配的工作量各個Adapter可能不一樣。工作范圍可能是,從簡單的接口轉換(例如改變操作名 )到支持完全不同的操作集合。Adapter的工作量取決于Target接口與Adaptee接口的相似程度。
道理很簡單:差別越多,適配的工作量也就越大。
2) 可插入的Adapter
當其他的類使用一個類時,如果所需的假定條件越少,這個類就更具可復用性。如果將接口匹配構建為一個類,就不需要假定對其他的類可見的是一個相同的接口。也就是說,接口匹配使得我們可以將自己的類加入到一些現有的系統中去,而這些系統對這個類的接口可能會有所不同。Object-Work / Smalltalk [ P a r 9 0 ]使用pluggable adapter一詞描述那些具有內部接口適配的類。
這段話不大好理解,作者努力解說一下。當我們設計一個類時,一般都存在一些假設。例如內存可以隨意適用,不需要多任務安全等。這樣的假設越少,類可以適用的場景就越多,也就是說更具可復用性。眾多假設中有一個就是類的用法,也就是接口。使用適配器意味著類可以任何方式適用。
考慮TreeDisplay窗口組件,它可以圖形化顯示樹狀結構。如果這是一個具有特殊用途的窗口組件,僅在一個應用中使用,我們可能要求它所顯示的對象有一個特殊的接口,即它們都是抽象類Tree的子類。如果我們希望使TreeDisplay有具有良好的復用性的話(比如說,我們希望將它作為可用窗口組件工具箱的一部分),那么這種要求將是不合理的。應用程序將自己定義樹結構類,而不應一定要使用我們的抽象類Tree。不同的樹結構會有不同的接口。
一般來講,TreeDisplay組件需要和某種Tree類協同工作。如果這個TreeDisplay只是在一個應用中使用,那么我們可以完全可以將需要TreeDisplay表示的數據設計成Tree的子類。但是如果希望TreeDisplay可以在各種場合,各種應用中使用時,就不應該有這個要求。因為對于已有類,這意味著類結構的巨大變化;對于新設計的類,為了一個表示功能,改變類本來的繼承關系也有些過分了。
例如,在一個目錄層次結構中,可以通過GetSubdirectories操作進行訪問子目錄,然而在一個繼承式層次結構中,相應的操作可能被稱為GetSubclasses。盡管這兩種層次結構使用的接口不同,一個可復用的TreeDisplay窗口組件必須能顯示所有這兩種結構。也就是說,TreeDisplay應具有接口適配的功能。
如果從取得下一級要素的角度來看,GetSubdirectories和GetSubclasses做的是相同的事。我們的設計的TreeDisplay需要滿足上述兩種要求。這屬于主動適配的范疇。
3) 使用雙向適配器提供透明操作 使用適配器的一個潛在問題是,它們不對所有的客戶都透明。被適配的對象不再兼容Adaptee的接口,因此并不是所有Adaptee對象可以被使用的地方它都可以被使用。雙向適配器提供了這樣的透明性。在兩個不同的客戶需要用不同的方式查看同一個對象時,雙向適配器尤其有用。
一般來講,適配器考慮的是讓Adaptee的功能在Adapter的上下文中被使用。在Adaptee的利用者看來,Adapter要么不可見(對象適配器),要么不一定好用(類適配器)。當我們需要從兩個方向都有需要使用某功能時,就需要雙向適配器。
考慮一個雙向適配器,它將圖形編輯框架 Unidraw [VL90]與約束求解工具箱QOCA[ H H M V 9 2 ]集成起來。這兩個系統都有一些類,這些類顯式地表示變量: Unidraw含有類StateVariable,QOCA中含有類ConstraintVariable,如下圖所示。為了使Unidraw與QOCA協同工作,必須首先使類ConstraintVariable與類StateVariable相匹配;而為了將QOCA的求解結果傳遞給Unidraw,必須使StateVariable與ConstraintVariable相匹配。
雙向適配器在兩個方向都有效。
這一方案中包含了一個雙向適配器ConstraintStateVariable,它是類ConstraintVariable與類StateVariable共同的子類,ConstraintStateVariable使得兩個接口互相匹配。在該例中多重繼承是一個可行的解決方案,因為被適配類的接口差異較大。雙向適配器與這兩個被匹配的類都兼容,在這兩個系統中它都可以工作。
本例中使用的是類適配器,ConstraintStateVariable即是ConstraintVariable又是StateVariable;其實也應該可以是使用對象適配器,這時ConstraintVariable和StateVariable共通分享一個ConstraintStateVariable。
關于“使用Adapter模式時需要考慮哪些因素”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。