生活中,充電插頭有兩腳的、三腳的,還有圓形的,若是想使這些插頭都能工做,就須要一個多功能適配器java
適配器模式(Adapter Pattern)屬於結構性模式,它能夠將某個類的接口轉換爲客戶端指望的另外一個接口表示,主要目的是兼容性,讓本來因接口不匹配不能一塊兒工做的兩個類能夠協同工做,其別名爲包裝器(Wrapper)。適配器模式主要分爲三類:類適配器模式、對象適配器模式、接口適配器模式。app
Adapter 類繼承 src 類,實現 dst 接口,完成 src 對 dst 的適配。ide
插座(Voltage220V)的輸出電壓是220V,充電插頭(Voltage5V)輸出電壓是5V,這時候就須要一個適配器(VoltageAdapter)轉換電壓,才能給手機(Phone)充電測試
電源輸出電壓爲220Vthis
public class Voltage220V { public int output220V() { int src = 220; System.out.println("電源輸出" + src + "V"); return src; } }
充電器輸出電壓爲5V設計
public interface Voltage5V { int output5V(); }
適配器須要將220V轉爲5Vcode
public class VoltageAdapter extends Voltage220V implements Voltage5V { @Override public int output5V() { int src = super.output220V(); int dst = src / 44; System.out.println("轉換爲" + dst + "V"); return dst; } }
手機接收5V電壓,判斷電壓是否爲5V對象
public class Phone { public static void charging(Voltage5V voltage5V){ int v = voltage5V.output5V(); if(v == 5){ System.out.println("接收電壓爲5V,正常充電"); }else if(v > 5){ System.out.println("電壓高於5V,沒法充電"); } } }
測試方法繼承
@Test public void test01(){ System.out.println("====類適配器模式===="); Phone.charging(new VoltageAdapter()); }
運行結果接口
====類適配器模式==== 電源輸出220V 轉換爲5V 接收電壓爲5V,正常充電
基本的思路和類的適配器模式相同,只是將 Adapter 類作修改,使用聚合關係替代繼承關係
沿用前面的代碼,新建一個適配器,只是將原來的 Adapter 繼承 src 類換爲聚合的關係
public class VoltageAdapter2 implements Voltage5V { private Voltage220V voltage220V; public VoltageAdapter2(){ this.voltage220V = new Voltage220V(); } @Override public int output5V() { int src = this.voltage220V.output220V(); int dst = src / 44; return dst; } }
測試方法
@Test public void test02(){ System.out.println("====對象適配器模式===="); Phone.charging(new VoltageAdapter2(new Voltage220V())); }
運行結果
====對象適配器模式==== 電源輸出220V 轉換爲5V 接收電壓爲5V,正常充電
接口適配器模式也可稱爲缺省適配器模式,當不須要實現接口的所有方法時,可先設計一個抽象類實現接口,併爲該接口的每一個方法都提供一個默認實現,那麼該抽象類的子類就能夠有選擇的覆蓋父類的某些方法來實現需求。
適用於一個接口不想使用其全部的方法的狀況
寫一個接口,裏面定義一些方法
public interface InterfaceMethod { void m1(); void m2(); void m3(); void m4(); }
一個抽象類,實現該接口
public abstract class AbstractAdapter implements InterfaceMethod { @Override public void m1() { } @Override public void m2() { } @Override public void m3() { } @Override public void m4() { } }
測試方法
@Test public void test(){ //使用匿名內部類的方式 AbstractAdapter adapter = new AbstractAdapter() { @Override public void m1() { System.out.println("我要用m1方法"); } }; adapter.m1(); }
運行結果
我要用m1方法
三種命名方式是根據 src 是以怎樣的形式給到 Adapter (在Adapter裏的形式)來命名的。
類適配器:以類給到,在 Adapter 裏,就是將 src 當作類,繼承
對象適配器:以對象給到,在 Adapter 裏, 將 src 做爲一個對象,持有
接口適配器:以接口給到,在 Adapter 裏,將 src 做爲一個接口,實現
Adapter模式最大的做用仍是將本來不兼容的接口融合在一塊兒工做。