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

C#面向?qū)ο笤O(shè)計(jì)模式縱橫談:Adapter 適配器模式

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

  適配,即在不改變原有實(shí)現(xiàn)的基礎(chǔ)上,將原先不兼容的接口轉(zhuǎn)換為兼容的接口。

image

  動機(jī)(Motivation)

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

  意圖(Intent)

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

                                           ——《設(shè)計(jì)模式》 GoF

  例說Adapter應(yīng)用

image

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

  結(jié)構(gòu)(Structure)

  適配器有兩種結(jié)構(gòu)

  -對象適配器(更常用)

image

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

  OO中優(yōu)先使用組合模式,組合模式不適用再考慮繼承。因?yàn)榻M合模式更加松耦合,而繼承是緊耦合的,父類的任何改動都要導(dǎo)致子類的改動。上面的例子就是對象適配器。

  -類適配器

image

  下面的例子是類適配器。

image

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

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

image

  而對于類適配器,因?yàn)镃#中類只能是單一繼承,它不能繼承自2個(gè)或2個(gè)以上的類,所以類適配器這里便無法使用。

  Adapter模式的幾個(gè)要點(diǎn)

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

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

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

image

image

image

  .NET框架中的Adapter應(yīng)用

  1.在.NET中復(fù)用COM對象:

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

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

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

  -各種數(shù)據(jù)庫并沒有提供DataSet接口

  -使用DbDataAdapter可以將任何個(gè)數(shù)據(jù)庫訪問/存取適配到一個(gè)DataSet對象上

image

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

 image

  DataSet就是一個(gè)適配器

image

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

  -現(xiàn)有對象未實(shí)現(xiàn)IComparer接口

  -實(shí)現(xiàn)一個(gè)排序適配器(繼承IComparer接口),然后在其Compare方法中對兩個(gè)對象進(jìn)行比較

image

image

  這樣寫是會報(bào)錯(cuò)的,因?yàn)橐褂肁rray.Sort的靜態(tài)方法,傳入的參數(shù)類型Employee必須要求實(shí)現(xiàn)IComparer接口。但如果Employee類已經(jīng)在很多地方使用了,我們不能更改它,這個(gè)時(shí)候可以考慮適配。Array.Sort方法本身提供了一種重載,可以傳入一個(gè)比較方法。

image

  因此我們可以重新寫一個(gè)類實(shí)現(xiàn)IComparer接口,這里是讓員工根據(jù)年齡排序

image

image

  這里的實(shí)現(xiàn)適配沒有把適配器放在類里面。沒必要非要做成教科書上的結(jié)構(gòu)才叫適配器,把適配對象直接作為參數(shù)傳遞一樣是一種很好的做法。

it知識庫C#面向?qū)ο笤O(shè)計(jì)模式縱橫談:Adapter 適配器模式,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产精品热久久高潮AV袁孑怡 | 日欧一片内射VA在线影院 | 日本最新在线不卡免费视频 | 免费99精品国产自在现线 | 久久热在线视频精品店 | 毛片大片免费看 | 美女扒开腿让男生桶爽免费APP | 亚洲七七久久桃花综合 | 国产精品无码人妻99999 | 双性大乳浪受噗呲噗呲h总 双性被疯狂灌满精NP | 99国产精品久久久久久久日本竹 | 高干紧射H后入 | 亚洲人成电影网站色2017 | 成人在线观看视频免费 | 双腿被绑成M型调教PLAY照片 | 十八禁肉动漫无修在线播放 | 欧美日韩亚洲一区二区三区在线观看 | 日本九九热在线观看官网 | 乱码AV午夜噜噜噜噜 | 亚洲AV蜜桃永久无码精品红樱桃 | 国产线精品视频在线观看 | 日韩精品一区二区亚洲AV观看 | 挠黑色超薄丝袜脚心vk40分钟 | 成人在线观看播放 | 蜜桃无码AV视频在线观看 | 午夜免费无码福利视频麻豆 | 日本孕妇大胆孕交 | 被强J高H纯肉公交车啊 | 婷婷综合亚洲爱久久 | 又黄又猛又爽大片免费 | 国产精品乱码一区二区三 | 国产成人理在线观看视频 | 在线色av| 国产久青青青青在线观看 | 黑吊大战白xxxxxx | 伊人青青操 | 插曲的痛30分钟视频最新章节 | 97超级碰久久久久香蕉人人 | 精品综合久久久久久8888 | 亚洲国产女人aaa毛片在线 | 8050午夜二级一片 |