Java 設(shè)計(jì)模式(一)《適配器模式》

博客專欄

適配器模式

  • 類型: 結(jié)構(gòu)型
  • 難度:入門級

更多設(shè)計(jì)模式小故事案例代碼詳解 >>點(diǎn)我!點(diǎn)我!點(diǎn)我!<< 設(shè)計(jì)模式忙芒,如此簡單~


別名

Wrapper (包裝)(適配器模式(Adapter Pattern)和裝飾器模式(Decorator Pattern)的統(tǒng)稱)


設(shè)計(jì)目的

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


釋義

生活中的例子

你有一個(gè)張內(nèi)存卡呵萨,有一臺(tái)電腦奏属,你現(xiàn)在想要看內(nèi)存卡上的照片,想聽內(nèi)存卡上的歌潮峦,想看內(nèi)存卡上的電影囱皿,但是你直接插電腦上又插不上去,所以你需要一個(gè)適配器忱嘹,那就是讀卡器嘱腥。這樣你的內(nèi)存卡就可以在電腦上運(yùn)行了。

你的iphone x的手機(jī)拘悦,想要聽歌齿兔,但是耳機(jī)忘記帶了,所以和我來借,可是我是國產(chǎn)的OPPO分苇,所以你從包里拿出來一個(gè)轉(zhuǎn)換插頭添诉,讓耳機(jī)插到轉(zhuǎn)換插頭上,再插到手機(jī)上医寿,這個(gè)轉(zhuǎn)換插頭就是適配器栏赴。

侵華的日本鬼子當(dāng)年侵華無法和我們溝通,結(jié)果你猜怎么著靖秩,那個(gè)漢奸就是適配器须眷,他把日語轉(zhuǎn)成了中文,把中文轉(zhuǎn)成了日語盆偿。勿忘國恥柒爸!

簡單來講

適配器模式可以讓你在適配器中包裝一個(gè)與另一個(gè)對象不兼容的對象,使其兼容事扭。

來自維基百科的解釋

將一個(gè)類的接口轉(zhuǎn)接成用戶所期待的捎稚。一個(gè)適配使得因接口不兼容而不能在一起工作的類能在一起工作,做法是將類自己的接口包裹在一個(gè)已存在的類中求橄。


代碼實(shí)例講解

有一個(gè)船長今野,只會(huì)使用劃艇,不會(huì)使用漁船罐农。

首先条霜,我們有接口RowingBoatFishingBoat

public interface RowingBoat {
  void row();
}

public class FishingBoat {
  private static final Logger LOGGER = LoggerFactory.getLogger(FishingBoat.class);
  public void sail() {
    LOGGER.info("The fishing boat is sailing");
  }
}

并且船長本身是會(huì)劃艇的,所以船長已經(jīng)實(shí)現(xiàn)了這個(gè)接口涵亏。

public class Captain implements RowingBoat {

  private RowingBoat rowingBoat;

  public Captain(RowingBoat rowingBoat) {
    this.rowingBoat = rowingBoat;
  }

  @Override
  public void row() {
    rowingBoat.row();
  }
}

現(xiàn)在來了一個(gè)海盜宰睡,并且只有漁船可以使用,我們的船長想要逃避海盜气筋,就只能使用漁船拆内。所以我們需要一個(gè)適配器來幫助船長來用他操作劃艇的技術(shù)來操作漁船。

public class FishingBoatAdapter implements RowingBoat {

  private static final Logger LOGGER = LoggerFactory.getLogger(FishingBoatAdapter.class);

  private FishingBoat boat;

  public FishingBoatAdapter() {
    boat = new FishingBoat();
  }

  @Override
  public void row() {
    boat.sail();
  }
}

現(xiàn)在宠默,船長既可以開著漁船逃避海盜了麸恍。

Captain captain = new Captain(new FishingBoatAdapter());
captain.row();

完整代碼傳送 >>>


使用契機(jī)

什么時(shí)候使用適配器模式?

  • 你想使用現(xiàn)有的類搀矫,但是這個(gè)類的接口不符合你所需要的抹沪。
  • 你現(xiàn)在想要?jiǎng)?chuàng)建一個(gè)類,用在一些彼此之間沒有太大關(guān)聯(lián)的類瓤球,包括一些以后將來引進(jìn)的類一起工作融欧。這些類不一定有一致的接口。
  • 通過接口轉(zhuǎn)換卦羡,將一個(gè)類插入另一個(gè)類系中蹬癌。(比如老虎和飛禽权她,現(xiàn)在多了一個(gè)飛虎,在不增加實(shí)體的需求下逝薪,增加一個(gè)適配器隅要,在里面包容一個(gè)虎對象,實(shí)現(xiàn)飛的接口董济。)
  • 大多數(shù)使用第三方庫的應(yīng)用程序使用適配器作為應(yīng)用程序和第三方庫之間的中間層挫鸽,以將應(yīng)用程序與庫解耦梭冠。如果必須使用另一個(gè)庫,則只需要為新庫添加適配器,而不必更改應(yīng)用程序代碼避消。

結(jié)論:

類適配器和對象適配器的區(qū)別

類適配器

  • 通過提交到具體的需要適配的類來使適配器來適應(yīng)目標(biāo)類缕碎。 因此佛点,當(dāng)我們想要調(diào)整類及其所有子類時(shí)朽寞,類適配器將不起作用。
  • 讓適配器覆蓋一些適配者的行為吹埠, 因?yàn)檫m配器是適配者的子類第步。
  • 只需要引入一個(gè)對象,不需要其他的指針來間接的指向適配器缘琅。
  • 適配器Adapter繼承我們的被適配者Adaptee粘都,并實(shí)現(xiàn)目標(biāo)接口。由于Java中是單繼承刷袍,所以這個(gè)適配器僅僅只能服務(wù)于所繼承的被適配者Adaptee

對象適配器

  • 適配器實(shí)現(xiàn)我們的目標(biāo)接口翩隧,但是并不繼承需要被適配的類。而是通過在適配器的構(gòu)造函數(shù)中將需要被適配的類傳遞進(jìn)來從而進(jìn)行適配
  • 讓一個(gè)適配器與許多適配者一起工作 - 即適配者本身及其所有子類(如果有的話)呻纹。 適配器還可以立即向所有適配者添加功能堆生。
  • 覆蓋適配者Adaptee的方法復(fù)雜困難,需要適配器使用一個(gè)適配者的子類雷酪,不能直接引用適配者淑仆。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  1. 可以讓任何兩個(gè)沒有關(guān)聯(lián)的類一起運(yùn)行。
  2. 提高了類的復(fù)用太闺。
  3. 增加了類的透明度。
  4. 靈活性好嘁圈。

缺點(diǎn):

  1. 過多地使用適配器省骂,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)行把握最住。比如钞澳,明明看到調(diào)用的是 A 接口,其實(shí)內(nèi)部被適配成了 B 接口的實(shí)現(xiàn)涨缚,一個(gè)系統(tǒng)如果太多出現(xiàn)這種情況轧粟,無異于一場災(zāi)難。因此如果不是很有必要,可以不使用適配器兰吟,而是直接對系統(tǒng)進(jìn)行重構(gòu)通惫。
  2. 由于 JAVA 至多繼承一個(gè)類,所以至多只能適配一個(gè)適配者類混蔼,而且目標(biāo)類必須是抽象類履腋。

jdk中使用到此模式的地方

JDK 1.9 中英文 chm 文檔下載


參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惭嚣,隨后出現(xiàn)的幾起案子遵湖,更是在濱河造成了極大的恐慌,老刑警劉巖晚吞,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件延旧,死亡現(xiàn)場離奇詭異,居然都是意外死亡槽地,警方通過查閱死者的電腦和手機(jī)迁沫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闷盔,“玉大人弯洗,你說我怎么就攤上這事》旯矗” “怎么了牡整?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溺拱。 經(jīng)常有香客問我逃贝,道長,這世上最難降的妖魔是什么迫摔? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任沐扳,我火速辦了婚禮,結(jié)果婚禮上句占,老公的妹妹穿的比我還像新娘沪摄。我一直安慰自己,他們只是感情好纱烘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布杨拐。 她就那樣靜靜地躺著,像睡著了一般擂啥。 火紅的嫁衣襯著肌膚如雪哄陶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天哺壶,我揣著相機(jī)與錄音屋吨,去河邊找鬼蜒谤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛至扰,可吹牛的內(nèi)容都是我干的鳍徽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渊胸,長吁一口氣:“原來是場噩夢啊……” “哼旬盯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翎猛,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胖翰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后切厘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萨咳,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年疫稿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了培他。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遗座,死狀恐怖舀凛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情途蒋,我是刑警寧澤猛遍,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站号坡,受9級特大地震影響懊烤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宽堆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一腌紧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畜隶,春花似錦壁肋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗡综,卻和暖如春乙帮,著一層夾襖步出監(jiān)牢的瞬間杜漠,已是汗流浹背极景。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工察净, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盼樟。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓氢卡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晨缴。 傳聞我的和親對象是個(gè)殘疾皇子译秦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容