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