21适配器模式(Adapter Pattern)
適配(轉換)的概念無處不在......
適配,即在不改變原有實現的基礎上,將原先不兼容的接口轉換為兼容的接口。
例如:二轉換為三箱插頭,將高電壓轉換為低電壓等。
????
動機(Motivate):
??? 在軟件系統中,由于應用環境的變化,常常需要將“一些現存的對象”放在新的環境中應用,但是新環境要求的接口是這些現存對象所不滿足的。
??? 那么如何應對這種“遷移的變化”?如何既能利用現有對象的良好實現,同時又能滿足新的應用環境所要求的接口?這就是本文要說的Adapter?模式。
意圖(Intent):
????將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
??? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? -------《設計模式》GOF
結構(Struct):
??? ?? ?? ?????
??? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??? 圖1:對象適配器
??? ?? ?? ?? ???
??? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??? 圖2:類適配器
生活中的例子:
??? ?? ?? ???
適用性:
??? 1.系統需要使用現有的類,而此類的接口不符合系統的需要。
??? 2.想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很復雜的接口。
??? 3.(對對象適配器而言)在設計里,需要改變多個已有子類的接口,如果使用類的適配器模式,就要針對每一個子類做一個適配器,而這不太實際。
示意性代碼實例:
2?????{
3?????????void?Push(object?item);
4?????????void?Pop();
5?????????object?Peek();
6?????} ?1?//對象適配器(Adapter與Adaptee組合的關系)?
?2?public?class?Adapter?:?IStack?//適配對象
?3????{
?4????????ArrayList?adaptee;//被適配的對象
?5????????public?Adapter()
?6????????{
?7????????????adaptee?=?new?ArrayList();
?8????????}
?9????????public?void?Push(object?item)
10????????{
11????????????adaptee.Add(item);
12????????}
13????????public?void?Pop()
14????????{
15????????????adaptee.RemoveAt(adaptee.Count?-?1);
16????????}
17????????public?object?Peek()
18????????{
19????????????return?adaptee[adaptee.Count?-?1];
20????????}
21????}
?類適配器
?1????public?class?Adapter?:ArrayList,?IStack?2????{
?3????????public?void?Push(object?item)
?4????????{
?5???????????this.Add(item);
?6????????}
?7????????public?void?Pop()
?8????????{
?9????????????this.RemoveAt(this.Count?-?1);
10????????}
11??????public??object?Peek()
12????????{
13????????????return?this[this.Count?-?1];
14????????}
15????}
Adapter模式的幾個要點:
??? Adapter模式主要應用于“希望復用一些現存的類,但是接口又與復用環境要求不一致的情況”,在遺留代碼復用、類庫遷移等方面非常有用。
??? GOF23定義了兩種Adapter模式的實現結構:對象適配器和類適配器。但類適配器采用“多繼承”的實現方式,帶來不良的高耦合,所以一般不推薦使用。對象適配器采用“對象組合”的方式,更符合松耦合精神。
??? Adapter模式可以實現的非常靈活,不必拘泥于GOF23中定義的兩種結構。例如,完全可以將Adapter模式中的“現存對象“作為新的接口方法參數,來達到適配的目的。
??? Adapter模式本身要求我們盡可能地使用”面向接口的編程"風格,這樣才能在后期很方便的適配。
.NET框架中的Adapter應用:
(1)在.Net中復用com對象:
?Com 對象不符合.net對象的接口
使用tlbimp.exe來創建一個Runtime Callable Wrapper(RCW)以使其符合.net對象的接口。
(2).NET數據訪問類(Adapter變體):
各種數據庫并沒有提供DataSet接口
使用DBDataAdapter可以將任何各數據庫訪問/存取適配到一個DataSet對象上。
(3)集合類中對現有對象的排序(Adapter變體);
現有對象未實現IComparable接口
實現一個排序適配器(繼承IComparer接口),然后在其Compare方法中對兩個對象進行比較。
總結
以上是生活随笔為你收集整理的21适配器模式(Adapter Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 股票分红与基金分红存在什么区别?一文看懂
- 下一篇: Sentinel 连接数据源