設計模式(8)適配器模式
阿新 • • 發佈:2019-03-18
設計模式 gif span ring .com 接口 interface abstract 關閉
適配器模式可以將一個類的接口,轉換成客戶期望的另外一個接口,讓原本接口不兼容的類可以合作無間。
現在我們有一個電視的類,新版電視的開關接口和老版電視的開關是不一樣的,客戶想要接著用老版電視的開關模式來操作新版電視,這時候就能用適配器模式來解決這個問題。
適配器模式可以分為對象適配器、類適配器和接口適配器三種,接下來先看看對象適配器,對象適配器是重新創建一個適配器類,實現了原先接口的方法,同時有一個新版電視對象,實現原先接口中的方法調用新版電視的方法。
我們設計一個NewTVAdapter的對象,實現TV接口,然後去調用NewTV的方法,具體代碼如下
public interfaceTVTV { public void on(); public void off(); }
public class OldTV implements TV { @Override public void on() { System.out.println("打開了老式電視!"); } @Override public void off() { System.out.println("關閉了老式電視!"); } }OldTV
publicNewTVclass NewTV { public void onTV() { System.out.println("打開了新款電視!"); } public void offTV() { System.out.println("關閉了新款電視!"); } }
public class NewTVAdapter implements TV { private NewTV newTV; public NewTVAdapter(NewTV newTV) {NewTVAdapterthis.newTV = newTV; } @Override public void on() { newTV.onTV(); } @Override public void off() { newTV.offTV(); } }
測試代碼
public static void main(String[] args) { TV tv1 = new OldTV(); tv1.on(); tv1.off(); NewTV newTV = new NewTV(); tv1 = new NewTVAdapter(newTV); tv1.on(); tv1.off(); }
測試結果
還有一種類適配器,創建一個適配器類,繼承新版電視,同時實現老版開關的接口,接口方法裏調用父類的開關方法
其他代碼一樣,就是適配器代碼有所改變
public class NewTVAdapterClass extends NewTV implements TV { @Override public void on() { super.onTV(); } @Override public void off() { super.offTV(); } }NewTVAdapterClass
測試代碼
public static void main(String[] args) { TV tv1 = new OldTV(); tv1.on(); tv1.off(); tv1 = new NewTVAdapterClass(); tv1.on(); tv1.off(); }
測試結果
還有一種接口適配器,它只有某一個或者某幾個方法,對其他的方法並不關心。(當然作為一個電視,只有一個關閉功能顯然不合理,這裏只是做一個例子)
代碼如下
public abstract class NewTVAdapterAbstract implements TV { @Override public void on() { } @Override public void off() { } }NewTVAdapterAbstract
public class NewTV2 extends NewTVAdapterAbstract{ @Override public void off() { System.out.println("新版的關閉方式!"); } }NewTV2
測試代碼
public static void main(String[] args) { TV tv1 = new OldTV(); tv1.on(); tv1.off(); tv1 = new NewTV2(); tv1.on(); tv1.off(); } }
測試結果
適配器模式將目標類和適配者類解耦,通過引入一個適配器類來重用現有的適配者類,無需修改原有結構,增加了類的透明性和復用性,擴展性很好。
設計模式(8)適配器模式