天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

C#面向對象設計模式縱橫談:Adapter 適配器模式

  適配(轉換)的概念無處不在

  適配,即在不改變原有實現的基礎上,將原先不兼容的接口轉換為兼容的接口。

image

  動機(Motivation)

  在軟件系統中,由于應用環境的變化,常常需要將“一些現存的對象”放在新的環境中應用,但是新環境要求的接口是這些現存對象所不滿足的。如何應對這種“遷移的變化”?如何既能利用現有對象的良好實現,同時又能滿足新的應用環境所要求的接口?

  意圖(Intent)

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

                                           ——《設計模式》 GoF

  例說Adapter應用

image

  這種實際上是一種委派的調用,本來是發送請求給MyStack,但是MyStack實際上是委派給list去處理。MyStack在這里其實就是Adapter(適配對象),list即是Adaptee(被適配的對象),而IStack就是客戶期望的接口。

  結構(Structure)

  適配器有兩種結構

  -對象適配器(更常用)

image

  對象適配器使用的是對象組合的方案,它的Adapter核Adaptee的關系是組合關系,即上面例子中MyStack和list是組合關系。

  OO中優先使用組合模式,組合模式不適用再考慮繼承。因為組合模式更加松耦合,而繼承是緊耦合的,父類的任何改動都要導致子類的改動。上面的例子就是對象適配器。

  -類適配器

image

  下面的例子是類適配器。

image

  Adapter繼承了ArrayList,也繼承了IStack接口,它既可以使用ArrayList里的方法,也可以使用IStack接口里的方法,這樣就感覺有點不倫不類。這個類違反了類應該具有單一職責的原則,它既有ArrayList的職責,也有IStack的職責,因此這種類適配不是很常用,也不推薦使用。

  另外,如果一個方法有可能要委托到2個或2個以上的對象,或者2個或2個以上的類需要委托,對于對象適配器,只需要增加幾個內部的屬性就可以實現適配。

image

  而對于類適配器,因為C#中類只能是單一繼承,它不能繼承自2個或2個以上的類,所以類適配器這里便無法使用。

  Adapter模式的幾個要點

  Adapter模式主要應用于“希望復用一些現存的類,但是接口又與復用環境要求不一致的情況”,在遺留代碼復用、類庫遷移等方面非常有用。

  GoF23定義了兩種Adapter模式的實現結構:對象適配器和類適配器。但類適配器采用“多繼承”的實現方式,帶來了不良的高耦合,所以一般不推薦使用。對象適配器采用“對象組合”的方式,更符合松耦合精神。Adapter模式可以實現的非常靈活,不必拘泥于GoF23中定義的兩種結構。例如,完全可以將Adapter模式中的“現存對象”作為新的接口方法參數,來達到適配的目的。

  Adapter模式本身要求我們盡可能地使用“面向接口的編程”風格,這樣才能在后期很方便地適配。

image

image

image

  .NET框架中的Adapter應用

  1.在.NET中復用COM對象:

  -COM對象不符合.NET對象的接口

  -使用tlbimp.exe來創建一個Runtime Callable Wrapper(RCW)以使其符合.NET對象的接口

  2..NET數據訪問類(Adapter變體):

  -各種數據庫并沒有提供DataSet接口

  -使用DbDataAdapter可以將任何個數據庫訪問/存取適配到一個DataSet對象上

image

  微軟把適配器和被適配的對象分離了,它把EmployeeDAO作為適配器了。這和上面的模式有點不同,但是原理都是一樣的,如果是寫成下面的樣子,就比較好理解了。

 image

  DataSet就是一個適配器

image

  3.集合類中對現有對象的排序(Adapter變體):

  -現有對象未實現IComparer接口

  -實現一個排序適配器(繼承IComparer接口),然后在其Compare方法中對兩個對象進行比較

image

image

  這樣寫是會報錯的,因為要使用Array.Sort的靜態方法,傳入的參數類型Employee必須要求實現IComparer接口。但如果Employee類已經在很多地方使用了,我們不能更改它,這個時候可以考慮適配。Array.Sort方法本身提供了一種重載,可以傳入一個比較方法。

image

  因此我們可以重新寫一個類實現IComparer接口,這里是讓員工根據年齡排序

image

image

  這里的實現適配沒有把適配器放在類里面。沒必要非要做成教科書上的結構才叫適配器,把適配對象直接作為參數傳遞一樣是一種很好的做法。

it知識庫C#面向對象設計模式縱橫談:Adapter 適配器模式,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 色欲天天婬色婬香影院 | 国产在线高清亚洲精品一区 | 国产毛多水多高潮高清 | 国产乱人伦AV麻豆网 | 国产日韩在线欧美视频 | 国产精品系列在线观看 | 亚洲 欧美 日韩 精品 自拍 | 国产亚洲精品久久久久5区 国产亚洲精品久久久久 | 久久本道久久综合伊人 | WWW国产精品内射熟女 | 久久综合香蕉久久久久久久 | 亚洲免费观看视频 | 夜夜骑夜夜欢 | 亚洲精品乱码久久久久久中文字幕 | 美女脱衣服搞鸡 | 国模玲玲自拍337p | 波多野结衣网站www 波多野结衣教师系列6 | 调教美丽的白丝袜麻麻视频 | 老女人与小伙子露脸对白 | 黑人娇小BBW | 欧美性情video sexo视频 | 久久亚洲人成网站 | 一个人免费视频在线观看高清版 | 国产久久精品热99看 | 欧美xxxx印度 | 欧美日韩亚洲第一区在线 | 啊…嗯啊好深男男高h文 | 扒开美女的内衣亲吻漫画 | 97色伦图区97色伦综合图区 | 熟女久久久久久久久久久 | 野花视频在线观看免费最新动漫 | 成人国产在线24小时播放视频 | 大香网伊人久久综合观看 | 十大禁止安装的黄台有风险 | 久久人妻少妇嫩草AV蜜桃99 | 免费看男人J放进女人J无遮掩 | 如懿传免费观看在线全集 | 蜜芽最新域名解析网站 | vagaa哇嘎黄短片 | 日韩插啊免费视频在线观看 | 国产精品无码亚洲区艳妇 |