java設計模式——適配器模式 Java源代碼

前言:適配器模式就是把一個類的接口變換成客戶端所能接受的另外一種接口,從而使兩個接口不匹配而沒法在一塊兒工做的兩個類可以在一塊兒工做。一般被用在一個項目須要引用一些開源框架來一塊兒工做時,這些框架的內部都有一些關於環境信息的接口,須要從外部引入,可是外部的接口不必定能匹配,在這種狀況下,就須要適配器模式來轉換接口。 

 

情景:美國的插座,提供110伏電壓;中國的插座,提供220伏電壓。編程

在中國,用兩孔插座充電
而後坐飛機去美國旅遊,假設美國某旅館的牆上有隻有一個三孔插座
幸虧我有美國適配器,一頭插到三孔插座,另外一頭轉換成二孔插座,就能夠給個人榮耀手機充電
在美國,經過美國適配器,用三空插座充電

框架

圖:不一樣國家的插座,插頭不同,呵呵噠ide

適配器


圖:因此須要寫一個適配器模式測試

適配器類圖

 

說明例子總共7個類 
一個三孔插座接口(Adaptee, 被適配者) 
一個三孔插座類 
一個兩孔插座接口(Target, 適配目標) 
一個兩孔插座類 
一個適配器(Adapter:實現Target, 組合Adaptee) 
一個手機類(Client) 
一個Main類,用於測試this

 


 

例子

三孔插座接口(Adaptee)

package adapter; // adaptee(被適配者) ———— 假設在美國某旅館的牆上,只有一個三孔插座
public interface ThreePinSoket { public void chargeWithThreePin(); public int voltage(); }

 

三孔插座類

package adapter; // 實現一個具體的 adaptee
public class ThreePinSoketAmerica implements ThreePinSoket { @Override public void chargeWithThreePin() { System.out.println("美國標準的三孔的插座"); } @Override public int voltage() { return 110;      // 美國電壓是110伏 
 } }

 

兩孔插座接口(Target)

package adapter; // client(具體的adaptee) ———— 這個就是我在中國的牆上的兩個插孔的插座,我充電只能用這個
public class TwoPinSoketChina implements TwoPinSoket { @Override public void chargeWithTwoPin() { System.out.println("中國標準的兩孔的插座"); } @Override public int voltage() { return 220;      // 中國電壓是220伏
 } }

 

適配器(Adapter)

實現Target, 組合Adapteespa

package adapter; // 去美國旅遊,必須帶上一個「美國適配器」:實現兩孔插座,組合三孔插座。用來給個人榮耀手機充電
public class AmericaAdapter implements TwoPinSoket // 實現兩孔插座(target)
{ ThreePinSoket threePinSoket; // 組合三孔插座(adaptee)

    public AmericaAdapter(ThreePinSoket threePinSoket) { this.threePinSoket = threePinSoket; } @Override public void chargeWithTwoPin() { threePinSoket.chargeWithThreePin(); } @Override public int voltage() { return threePinSoket.voltage() * 2; // 適配器把電壓從 110V 升到 220V 
 } }

 

手機類(Client)

package adapter; public class RongYao { TwoPinSoket twoPinSoket; public RongYao() {} public void setTwoPinSoket(TwoPinSoket twoPinSoket) { this.twoPinSoket = twoPinSoket; } public void chargeRequest() { System.out.println("華爲榮耀手機, " + twoPinSoket.voltage() + " 伏特充電中\n"); } }

 

Main類,用於測試

package adapter; public class Main { public static void main(String[] args) { // 在中國,用兩孔插座充電
        TwoPinSoketChina twoPinSoketChina = new TwoPinSoketChina(); RongYao myRongYao = new RongYao(); myRongYao.setTwoPinSoket(twoPinSoketChina); myRongYao.chargeRequest(); // 而後坐飛機去美國旅遊,美國某旅館的牆上有隻有一個三孔插座
        ThreePinSoketAmerica threePinSoketAmerica = new ThreePinSoketAmerica(); testThreePin(threePinSoketAmerica); // 幸虧我有美國適配器,一頭插到三孔插座,另外一頭轉換成二孔插座,就能夠給個人榮耀手機充電
        AmericaAdapter americaAdapter = new AmericaAdapter(threePinSoketAmerica); testTwoPin(americaAdapter); // 在美國,經過美國適配器,用三空插座充電
 myRongYao.setTwoPinSoket(americaAdapter); myRongYao.chargeRequest(); } static void testTwoPin(TwoPinSoket twoPinSoket) { twoPinSoket.chargeWithTwoPin(); System.out.println("電壓是" + twoPinSoket.voltage() + "伏特\n"); } static void testThreePin(ThreePinSoket threePinSoket) { threePinSoket.chargeWithThreePin(); System.out.println("電壓是" + threePinSoket.voltage() + "伏特\n"); } }

運行結果

華爲榮耀手機,code

220 伏特充電中blog

 

 

美國標準的三孔的插座接口

電壓是110伏特three

 

美國標準的三孔的插座

電壓是220伏特

 

 

華爲榮耀手機,

220 伏特充電中

 

分析

適配器模式有三個重要角色:

  • 目標角色(Target),要轉換成的目標接口。在個人代碼例子中,是中國的兩孔接口
  • 源角色(Adaptee),須要被轉換的源接口。在個人代碼例子中,是美國的三孔接口
  • 適配器角色(Adapter),核心是實現Target接口, 組合Adaptee接口

這樣,Adaptee和Target兩個本來不兼容的接口,就能夠在一塊兒工做了(個人榮耀手機就能夠在美國充電了)。這裏的面向接口編程,獲得了鬆耦合的效果。

美國的三孔插座能夠實現Adaptee接口,那麼英國、法國的三孔插座也能夠去實現Adaptee接口,它們都成爲了Adaptee接口的子類。在Adapter類中,因爲組合了一個Adaptee的引用,根據Java的多態性,我就能夠拿着相同的Adapter類去英國,法國充電了。

另外一方面,Client類組合一個Target接口的引用。咱們就可製造多個Adapter類,實現同一個Target接口。假設索尼手機的須要日本標準的兩孔插座,那麼寫一個日本兩孔插座類實現Target接口,我就能夠拿着相同的Adapter類,在美國給日本的索尼手機充電了。

相關文章
相關標籤/搜索