1、前言設計模式
適配器模式分爲兩類,所謂「適配」就是適當的配合或者恰當的配合,想一下電源的適配器,完成的做用是將交流電220V轉化成不一樣的直流電壓,來對手機、電腦、檯燈等充電,若是沒有這些適配器,咱們的設備早就着火了或者報廢了,是一件很可怕的事情,那麼適配器就是起到一個轉換的做用,將物質(數據)由某種形式轉換成另外一種形式,使得適配後的一方可以接收和使用,那麼咱們經過分析也知道,適配器中的角色大致上分爲三種使用適配器的角色(手機等)、適配器自己(適配器)、被適配的角色(交流電)。但是做爲高內聚低耦合的設計思想指導,咱們在手機和適配器中間再加上一層接口,手機直接使用這個接口來使用適配器,而不是高耦合的直接使用,所以主要的角色就有四個了。再考慮到適配器和被適配的角色之間的適配方式,咱們可使用繼承來適配也可使用組合來適配,所以,適配器也就分爲經過使用繼承的適配器——類適配器和使用組合(委託)的適配器——對象適配器。函數
2、類適配器this
package zyr.dp.adapter; public class Banner { private String name; public Banner(String name){ this.name=name; } public void showWithParen(){ System.out.println("("+name+")"); } public void showWithAster(){ System.out.println("*"+name+"*"); } }
package zyr.dp.adapter; public interface Print { public abstract void printWeak(); public abstract void printStrong(); }
package zyr.dp.adapter; public class PrintBanner extends Banner implements Print { public PrintBanner(String name) { super(name); } public void printWeak() { System.out.println("...開始弱適配..."); showWithParen(); System.out.println("...弱適配成功..."); System.out.println(); } public void printStrong() { System.out.println("...開始強適配..."); showWithAster(); System.out.println("...強適配成功..."); System.out.println(); } }
能夠看到使用適配器,咱們將Banner對象這個很高的電壓經過PrintBanner這個適配器進行適配以後,經過main函數進行使用,使用的時候經過print接口進行引用,便於程序的可擴展性,好比說還有一個適配器對字符串進行了處理,咱們只用在main中修改很是少的代碼便可以使用,這樣就實現了低內聚高耦合。.net
3、對象適配器設計
package zyr.dp.adapter.objectpattern; public class Banner { private String name; public Banner(String name){ this.name=name; } public void showWithParen(){ System.out.println("("+name+")"); } public void showWithAster(){ System.out.println("*"+name+"*"); } }
package zyr.dp.adapter.objectpattern; public abstract class Print { public abstract void printWeak(); public abstract void printStrong(); }
package zyr.dp.adapter.objectpattern; public class PrintBanner extends Print { Banner banner; public PrintBanner(String name) { banner=new Banner(name); } public void printWeak() { System.out.println("...開始弱適配..."); banner.showWithParen(); System.out.println("...弱適配成功..."); System.out.println(); } public void printStrong() { System.out.println("...開始強適配..."); banner.showWithAster(); System.out.println("...強適配成功..."); System.out.println(); } }
package zyr.dp.adapter.objectpattern; public class Main { public static void main(String[] args) { Print p=new PrintBanner("朱彥榮"); p.printStrong(); p.printWeak(); } }
能夠看到main函數、banner類都沒有改動,將print接口變成抽象類,那麼printBanner不能同時繼承兩個類,所以將banner對象組合到適配器之中,所以叫作對象適配器,這樣也能夠實現預期的結果。二者的區別也是很是明顯的,推薦使用前者,或者根據實際狀況須要進行甄別。code
4、總結對象
適配器模式有兩種,咱們須要根據實際狀況來使用,咱們可能使用一些已經封裝好的代碼,有的時候須要對其進行稍微的修改,但是這些代碼同時被其它組件鎖使用,咱們不能再原來的程序上改動,所以經過適配器模式,咱們將這些代碼進行進一步的處理,而後再使用,咱們不能再原來的程序上改動,所以經過適配器模式,咱們將這些代碼進行進一步處理,而後再使用,這樣的設計方法很是好,由於咱們保證了在不修改原來代碼的狀況下實現了代碼的複用和個性化。通常在系統升級的時候,須要保證兼容性,咱們將新系統做爲被適配的對象,經過本身定義的適配器保證在舊系統上一節可使用以前的功能,保證了兼容性。blog