資源描述:
《13適配器模式類(lèi)適配器、對(duì)象適配器》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、適配器模式(Adapter):將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。適用場(chǎng)景:1、已經(jīng)存在的類(lèi)的接口不符合我們的需求;2、創(chuàng)建一個(gè)可以復(fù)用的類(lèi),使得該類(lèi)可以與其他不相關(guān)的類(lèi)或不可預(yù)見(jiàn)的類(lèi)(即那些接口可能不一定兼容的類(lèi))協(xié)同工作;3、在不對(duì)每一個(gè)都進(jìn)行子類(lèi)化以匹配它們的接口的情況下,使用一些已經(jīng)存在的子類(lèi)。通用類(lèi)圖:?電源適配器,它是用于電流變換(整流)的設(shè)備。適配器的存在,就是為了將已存在的東西(接口)轉(zhuǎn)換成適合我們的需要、能被我們所利用。在現(xiàn)實(shí)生活中,適配器更多的是作為一個(gè)中間層來(lái)實(shí)現(xiàn)這種轉(zhuǎn)換作用。在上面的
2、通用類(lèi)圖中,Cient類(lèi)最終面對(duì)的是Target接口(或抽象類(lèi)),它只能夠使用符合這一目標(biāo)標(biāo)準(zhǔn)的子類(lèi);而Adaptee類(lèi)則是被適配的對(duì)象(也稱源角色),因?yàn)樗瑂pecific(特殊的)操作、功能等,所以我們想要在自己的系統(tǒng)中使用它,將其轉(zhuǎn)換成符合我們標(biāo)準(zhǔn)的類(lèi),使得Client類(lèi)可以在透明的情況下任意選擇使用ConcreteTarget類(lèi)或是具有特殊功能的Adatee類(lèi)。代碼實(shí)現(xiàn)如下://已存在的、具有特殊功能、但不符合我們既有的標(biāo)準(zhǔn)接口的類(lèi)classAdaptee{publicvoidspecificRequest(){System.out.println("被適配類(lèi)具有特殊功能...
3、");}}//目標(biāo)接口,或稱為標(biāo)準(zhǔn)接口interfaceTarget{publicvoidrequest();}//具體目標(biāo)類(lèi),只提供普通功能classConcreteTargetimplementsTarget{publicvoidrequest(){System.out.println("普通類(lèi)具有普通功能...");}}?//適配器類(lèi),繼承了被適配類(lèi),同時(shí)實(shí)現(xiàn)標(biāo)準(zhǔn)接口classAdapterextendsAdapteeimplementsTarget{publicvoidrequest(){super.specificRequest();//特殊調(diào)用}}?//測(cè)試類(lèi)publiccla
4、ssClient{publicstaticvoidmain(String[]args){//使用普通功能類(lèi)TargetconcreteTarget=newConcreteTarget();concreteTarget.request();//使用特殊功能類(lèi),即適配類(lèi)Targetadapter=newAdapter();adapter.request();}}測(cè)試結(jié)果:普通類(lèi)具有普通功能...被適配類(lèi)具有特殊功能...?上面這種實(shí)現(xiàn)的適配器稱為類(lèi)適配器,因?yàn)锳dapter類(lèi)既繼承了Adaptee(被適配類(lèi)),也實(shí)現(xiàn)了Target接口(因?yàn)镴ava不支持多繼承,所以這樣來(lái)實(shí)現(xiàn)),在Client
5、類(lèi)中我們可以根據(jù)需要選擇并創(chuàng)建任一種符合需求的子類(lèi),來(lái)實(shí)現(xiàn)具體功能。另外一種適配器模式是對(duì)象適配器,它不是使用多繼承或繼承再實(shí)現(xiàn)的方式,而是使用直接關(guān)聯(lián),或者稱為委托的方式,類(lèi)圖如下:?代碼實(shí)現(xiàn)如下://適配器類(lèi),直接關(guān)聯(lián)被適配類(lèi),同時(shí)實(shí)現(xiàn)標(biāo)準(zhǔn)接口classAdapterimplementsTarget{//直接關(guān)聯(lián)被適配類(lèi)privateAdapteeadaptee;//可以通過(guò)構(gòu)造函數(shù)傳入具體需要適配的被適配類(lèi)對(duì)象publicAdapter(Adapteeadaptee){this.adaptee=adaptee;}publicvoidrequest(){//這里是使用委托的方式完成特殊
6、功能this.adaptee.specificRequest();}}//測(cè)試類(lèi)publicclassClient{publicstaticvoidmain(String[]args){//使用普通功能類(lèi)TargetconcreteTarget=newConcreteTarget();concreteTarget.request();//使用特殊功能類(lèi),即適配類(lèi),//需要先創(chuàng)建一個(gè)被適配類(lèi)的對(duì)象作為參數(shù)Targetadapter=newAdapter(newAdaptee());adapter.request();}}?測(cè)試結(jié)果與上面的一致。從類(lèi)圖中我們也知道需要修改的只不過(guò)就是Adapt
7、er類(lèi)的內(nèi)部結(jié)構(gòu),即Adapter自身必須先擁有一個(gè)被適配類(lèi)的對(duì)象,再把具體的特殊功能委托給這個(gè)對(duì)象來(lái)實(shí)現(xiàn)。使用對(duì)象適配器模式,可以使得Adapter類(lèi)(適配類(lèi))根據(jù)傳入的Adaptee對(duì)象達(dá)到適配多個(gè)不同被適配類(lèi)的功能,當(dāng)然,此時(shí)我們可以為多個(gè)被適配類(lèi)提取出一個(gè)接口或抽象類(lèi)。這樣看起來(lái)的話,似乎對(duì)象適配器模式更加靈活一點(diǎn)。小結(jié):1、適配器模式也是一種包裝模式,與之前的Decorator裝飾模式同樣具有包裝的功能;此外,