情景:美國的插座,提供110伏電壓;中國的插座,提供220伏電壓。編程
在中國,用兩孔插座充電
而後坐飛機去美國旅遊,假設美國某旅館的牆上有隻有一個三孔插座
幸虧我有美國適配器,一頭插到三孔插座,另外一頭轉換成二孔插座,就能夠給個人榮耀手機充電
在美國,經過美國適配器,用三空插座充電
框架
圖:不一樣國家的插座,插頭不同,呵呵噠ide
圖:因此須要寫一個適配器模式測試
說明例子總共7個類
一個三孔插座接口(Adaptee, 被適配者)
一個三孔插座類
一個兩孔插座接口(Target, 適配目標)
一個兩孔插座類
一個適配器(Adapter:實現Target, 組合Adaptee)
一個手機類(Client)
一個Main類,用於測試this
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伏
} }
package adapter; // client(具體的adaptee) ———— 這個就是我在中國的牆上的兩個插孔的插座,我充電只能用這個
public class TwoPinSoketChina implements TwoPinSoket { @Override public void chargeWithTwoPin() { System.out.println("中國標準的兩孔的插座"); } @Override public int voltage() { return 220; // 中國電壓是220伏
} }
實現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
} }
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"); } }
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 伏特充電中
適配器模式有三個重要角色:
這樣,Adaptee和Target兩個本來不兼容的接口,就能夠在一塊兒工做了(個人榮耀手機就能夠在美國充電了)。這裏的面向接口編程,獲得了鬆耦合的效果。
美國的三孔插座能夠實現Adaptee接口,那麼英國、法國的三孔插座也能夠去實現Adaptee接口,它們都成爲了Adaptee接口的子類。在Adapter類中,因爲組合了一個Adaptee的引用,根據Java的多態性,我就能夠拿着相同的Adapter類去英國,法國充電了。
另外一方面,Client類組合一個Target接口的引用。咱們就可製造多個Adapter類,實現同一個Target接口。假設索尼手機的須要日本標準的兩孔插座,那麼寫一個日本兩孔插座類實現Target接口,我就能夠拿着相同的Adapter類,在美國給日本的索尼手機充電了。