適配器模式:將一個類的接口轉換成客戶但願的另一個接口,適配器模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。
適配器模式試用場景:
- 現存接口不知足業務場景,在有可複用類的狀況下經過適配器,在調用原有接口,可使用新接口的實現
- 在不對每個都進行子類化以匹配它們的接口的狀況下,使用一些已經存在的子類。
舉個栗子: 香港的充電插頭跟國內是有差別的,咱們先來看看香港充電插頭標準跟實現java
//香港插頭標準 public interface HKNormInterface { void threeHoles(); } //香港插頭標準實現 public class HKNormImpl implements HKNormInterface { @Override public void threeHoles() { System.out.println("使用香港標準...."); } } //香港酒店使用香港充電標準 public class HKHotel { private HKNormInterface hkNormInterface; public void useHKNorm(){ hkNormInterface.threeHoles(); } public HKNormInterface getHkNormInterface() { return hkNormInterface; } public void setHkNormInterface(HKNormInterface hkNormInterface) { this.hkNormInterface = hkNormInterface; } } //在酒店使用香港標準 public static void main(String[] args){ HKHotel hkHotel = new HKHotel(); HKNormInterface hkNorm = new HKNormImpl(); hkHotel.setHkNormInterface(hkNorm); hkHotel.useHKNorm(); }
執行main方法後,會打印使用香港標準,這是沒問題的.(main方法本身隨便一個類複製過去就能使用)ide
而後是咱們國內的標準測試
//國內插頭標準 public interface CNNormInterface { void twoHoles(); } //國內插頭標準實現 public class CNNormImpl implements CNNormInterface{ @Override public void twoHoles() { System.out.println("使用國內標準"); } }
那麼問題來了,你在香港,帶着國內標準的插頭,沒有香港的標準插頭,你是用不了插頭來充電的,由於標準(接口)不同,這時候,你須要一個轉接器(適配器)才能使用充電,轉接器以下this
PS:也能夠選擇不繼承CNNormImpl,經過組合使用CNNormInterface接口也能夠的spa
//適配國內的標準,能夠在香港使用國內的充電插頭 public class ApaterCNNorm extends CNNormImpl implements HKNormInterface{ @Override public void threeHoles() { super.twoHoles(); } }
而後咱們的測試方法就要修改一下了,改爲以下:代理
public static void main(String[] args){ HKHotel hkHotel = new HKHotel(); //HKNormInterface hkNorm = new HKNormImpl(); HKNormInterface hkNorm = new ApaterCNNorm(); hkHotel.setHkNormInterface(hkNorm); hkHotel.useHKNorm(); }
執行後會打印,使用國內標準,說明使用適配成功了,code
上面,咱們只建立了一個適配器類,在使用的時候,替換掉了HKNorImpl實現,轉換爲適配器的實現(ApaterCNNorm),接口不變,只修改了調用方的一行代碼,下降了代碼的耦合,甚至調用方都不知道,中間有一層適配器,覺得仍是香港標準,其實內部已經變爲國內標準了.
UML圖以下,各位同窗能夠看一下,加深對適配器模式的理解:
適配器(ApaterCNNorm)經過繼承CNNormImpl實現HKNormInterface接口來保證類型的統一,表面上調用的仍是HKNormImpl的threeHoles方法,實際上使用的是CNNormImpl的twoHoles的實現orm
PS:筆者以爲,適配器模式更像是靜態代理模式的變種....繼承
到這,文章就結束了!接口
以上,均爲本人我的理解,比較簡單的理解,或許跟各位看官理解的有出入,歡迎指正交流
歡迎轉載,請註明出處跟做者,謝謝!