23種設(shè)計(jì)模式(5) java適配器模式
23種設(shè)計(jì)模式第五篇:java適配器模式
定義:
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
角色:
目標(biāo)(Target)角色:這就是所期待得到的接口,也就是這類的接口是符合我們要求的。
源(Adapee)角色:我們要使用的接口,但是這個(gè)接口不符合我們的要求,也就是現(xiàn)在需要適配的接口。
適配器(Adaper)角色:適配器類是適配器模式的核心。適配器把源接口轉(zhuǎn)換成目標(biāo)接口。顯然,這一角色不可以是接口,而必須是具體類。
分類:
1、類適配器模式
class Adaptee {
publicvoid specificRequest() {
System.out.println("特殊請(qǐng)求,這個(gè)是源角色");
}
}
/*這個(gè)是目標(biāo)角色,所期待的接口*/
interface Target {
publicvoid request();
}
現(xiàn)在想要實(shí)現(xiàn)這個(gè)Target接口,但是不想重構(gòu),想要用上已有的Adaptee類,這時(shí)可以定義一個(gè)適配器類,繼承想要使用的類,并且實(shí)現(xiàn)期待的接口。
class Adapter extends Adaptee implementsTarget{
publicvoid request() {
super.specificRequest();
}
}
這樣,使用適配器類和實(shí)現(xiàn)目標(biāo)接口就完成了計(jì)劃,測(cè)試:
public class Test{
publicstatic void main(String[] args) {
//使用特殊功能類,即適配類
Targetadapter = new Adapter();
adapter.request();
}
}
2、對(duì)象適配器模式
適配器類關(guān)聯(lián)已有的Adaptee類,并且實(shí)現(xiàn)標(biāo)準(zhǔn)接口,這樣做的好處是不再需要繼承。
class Adapter implements Target{
privateAdaptee adaptee;
publicAdapter (Adaptee adaptee) {
this.adaptee= adaptee;
}
publicvoid request() {
this.adaptee.specificRequest();
}
}
我們可以想到,此時(shí)輸出結(jié)果和類適配器模式是相同的,測(cè)試:
public class Test{
publicstatic void main(String[] args) {
Targetadapter = new Adapter(new Adaptee());
adapter.request();
}
}
區(qū)別:
對(duì)象的適配器模式不是使用繼承關(guān)系連接到Adaptee類,而是使用委派關(guān)系連接到Adaptee類。
優(yōu)點(diǎn):
復(fù)用性
系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要。那么通過(guò)適配器模式就可以讓這些功能得到更好的復(fù)用。
擴(kuò)展性
在實(shí)現(xiàn)適配器功能的時(shí)候,可以自由調(diào)用自己開(kāi)發(fā)的功能,從而自然地?cái)U(kuò)展系統(tǒng)的功能。
缺點(diǎn):
過(guò)多的使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)行把握。比如,明明看到調(diào)用的是A接口,其實(shí)內(nèi)部被適配成了B接口的實(shí)現(xiàn)。所以適配器模式不適合在詳細(xì)設(shè)計(jì)階段使用它,它是一種補(bǔ)償模式,專用來(lái)在系統(tǒng)后期擴(kuò)展、修改時(shí)所用。
適用場(chǎng)景:
1、已經(jīng)存在的類的接口不符合我們的需求;
2、創(chuàng)建一個(gè)可以復(fù)用的類,使得該類可以與其他不相關(guān)的類或不可預(yù)見(jiàn)的類協(xié)同工作;
3、使用一些已經(jīng)存在的子類而不需要對(duì)其進(jìn)行子類化來(lái)匹配接口。
4、舊的系統(tǒng)開(kāi)發(fā)的類已經(jīng)實(shí)現(xiàn)了一些功能,但是客戶端卻只能以另外接口的形式訪問(wèn),但我們不希望手動(dòng)更改原有類的時(shí)候。
小結(jié):
適配器模式不適合在詳細(xì)設(shè)計(jì)階段使用它,它是一種補(bǔ)償模式,專用來(lái)在系統(tǒng)后期擴(kuò)展、修改時(shí)所用,適配器模式更像是一種補(bǔ)救措施。
轉(zhuǎn)自:java知音
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java中數(shù)組list map三者之間的互轉(zhuǎn)介紹
java中 數(shù)組 list map之間的互轉(zhuǎn)一張圖清晰呈現(xiàn)并附有代碼,不懂的朋友可以參考下2013-10-10
詳解Java集合中的基本數(shù)據(jù)結(jié)構(gòu)
總有小伙伴讓我總結(jié)一下Java集合中的基本數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),今天特地整理了本篇文章,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06
Socket與ServerSocket類構(gòu)造方法與API
今天小編為大家整理了Socket與ServerSocket類構(gòu)造方法與API,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值。需要的朋友可以收藏下,方便下次瀏覽觀看2021-12-12
Java中g(shù)etParameterTypes()方法的使用與原理分析
本文詳細(xì)介紹了Java中g(shù)etParameterTypes()方法的使用方式、工作原理及其在實(shí)際開(kāi)發(fā)中的應(yīng)用,該方法用于獲取方法的參數(shù)類型列表,并通過(guò)反射機(jī)制在運(yùn)行時(shí)動(dòng)態(tài)地獲取這些信息,感興趣的朋友跟隨小編一起看看吧2025-01-01
Spring Boot支持Crontab任務(wù)改造的方法
這篇文章主要介紹了Spring Boot支持Crontab任務(wù)改造的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
深入理解Netty?FastThreadLocal優(yōu)缺點(diǎn)及實(shí)現(xiàn)邏輯
本文以線上詭異問(wèn)題為切入點(diǎn),通過(guò)對(duì)比JDK ThreadLocal和Netty FastThreadLocal實(shí)現(xiàn)邏輯以及優(yōu)缺點(diǎn),并深入解讀源碼,由淺入深理解Netty FastThreadLocal2023-10-10
struts2標(biāo)簽總結(jié)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)總結(jié)了struts2標(biāo)簽的使用方法,和學(xué)習(xí)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09

