天天看點

擴充卡模式之對象擴充卡

  問題導入:比如有a型螺母和b型螺母,那麼使用者可以再a型螺母上直接使用按着a型螺母生産的a型螺絲,同樣也可以在b型螺母上直接使用按着b型

螺母标準生産的b型螺絲。但是由于a型螺母和b型螺母的标準不一樣,使用者在a型螺母上不能直接使用b型的螺絲,反之也一樣。該如何達到這個目的呢?

  使用擴充卡就可以解決這個問題:生産一種“a型螺母擴充卡”,這種a型螺母擴充卡的前端符合a型螺母标準要求,可以擰在a型螺母上,後端又焊接了一個b型螺母。這樣使用者就可以借助a型螺母擴充卡在a型螺母上使用b型的螺絲了。

  擴充卡模式又稱為包裝器,是用來将一個類的接口轉換成客戶希望的另外一個接口。這可以使得原本由于接口不相容而不能一起工作的那些類可以一起工作。擴充卡模式的關鍵是建立一個擴充卡,這個擴充卡實作了目标接口并且包含了被适配者的引用。

<a></a>

擴充卡模式的三種角色:

  一、目标:目标是一個接口,該接口是客戶想要使用的接口。

  二、被适配者:被适配者是一個已經存在的接口或抽象類,這個接口接口或者抽象類需要适配。

  三、擴充卡:擴充卡是一個類,該類實作了目标接口并且包含有被适配者的引用,即擴充卡的職責是對适配者接口或抽象類與目标接口進行适配。

  以下通過一個簡單的問題來描述擴充卡模式中所涉及的各個角色。

  使用者已經有一個兩廂的插座,但是最近使用者又有了一個新的三廂插座。使用者現有一台洗衣機和一台電視機,洗衣機是三廂插頭,而電視機是兩廂插頭。現在使用者想用心的三廂插座來使用洗衣機和電視機,即用心的三廂插座為洗衣機和電視機接通電流。

  針對以上問題,使用擴充卡模式設計若幹個類。

  1.目标

  本問題是使用三廂插座來為電視機和洗衣機接通電流,是以目标是三廂插座。把三廂插座設定為一個接口:

 2.被适配者

  對于本問題,使用者是想要用三廂插座為兩廂插頭的電視機接通電流,是以被适配者應該是兩廂插座,也設定為一個接口:

  3.擴充卡

  該擴充卡實作了目标接口三廂插座threeelectricoutlet,同時又包含了兩廂插座twoelectricoutlet的引用:

  下列應用程式中,application.java使用了擴充卡模式中所涉及的類,應用程式負責用wash類建立一個對象來模拟一台洗衣機,使用tv類建立一個對象來模拟一台電視機

使用threeelectricoutlet接口變量調用wash對象的connectelectriccurrent()方法,并借助擴充卡調用tv對象的connectelectriccurrent()方法,即用三廂插座分别為洗衣機和電視機接通電流。

運作結果為:

使用三相插座接通電流

黃河洗衣機開始洗衣服了

使用三廂插座接通電流

長江電視機開始播放電視節目

下面舉個雙向擴充卡的例子

  在擴充卡模式中,如果adapter角色同時實作目标接口和被适配者接口,并包含目标接口和被适配接口的引用,那麼該擴充卡就是一個雙向适配

器。使用雙向擴充卡,使用者既可以用新的接口又可以用已有的接口。在以上例子中,如果使用者希望能有三廂插座來接通洗衣機和電視機的電流,有可以用兩廂插座來

接通洗衣機和電視機的電流,那麼就必須使用一個雙向擴充卡。具體代碼如下:

使用三廂插座接通電源

使用兩廂插座接通電源

這樣就實作了即可以用三廂插座又可以用兩廂插座來為電視機和洗衣機接通電流了。

使用擴充卡模式主要有以下優點:

  1.目标和被适配者是完全解耦的關系。

  2.擴充卡模式滿足“開–閉原則”,當添加一個實作了adapter接口的新類時,不必修改adapter,adapter就能對這個新類的執行個體進行适配。