设计模式-适配器模式(类适配器、对象适配器、接口适配器详解)
文章目錄
- 適配器模式
- 類適配器
- 對象適配器
- 接口適配器
- 總結
適配器模式
適配器模式(Adapter Pattern)將某個類的接口轉換成客戶端期望的另一個接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個類可以協同工作。也稱包裝器(Wrapper),屬于結構型模式。適配器模式主要分為三類:類適配器模式、對象適配器模式、接口適配器模式
工作原理
將一個類的接口轉換成另一種接口,讓原本接口不兼容的類可以兼容。從用戶的角度看不到被適配者,是解耦的/。用戶調用適配器轉化出來的目標接口方法,適配器再調用被適配者的相關接口方法,用戶收到反饋結果,感覺只是和目標接口交互。
簡單來說,適配器模式就像個插頭轉換器,讓不同標準的插頭和插座可以一起使用,而插座就是原來的接口,插頭是用戶期望的接口。或者類比電源適配器,把原來的220V電壓轉換成5V電壓等。
類適配器
顧名思義,通過適配器通過類來實現,以類來繼承和實現接口的方式,來獲取被適配類的信息并轉換輸出重寫到適配接口。即Adapter類,通過繼承src類,實現dst類接口,完成src->dst的適配。
優缺點:
對象適配器
顧名思義,通過實例對象(構造器傳遞)來實現適配器,而不是再用繼承,其余基本同類適配器。即:持有src類,實現dst類接口,完成src->dst的適配。
(插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/
//被適配的類(不變) public class Voltage220V {public int output220V() {int src = 220;System.out.println("電壓=" + src);return src;} }//適配接口(不變) public interface IVoltage5V {public int output5V(); }//適配器類 public class VoltageAdapter implements IVoltage5V {private Voltage220V voltage220V;//構造器public VoltageAdapter(Voltage220V voltage220v) {this.voltage220V = voltage220v;}@Overridepublic int output5V() {int dst = 0;if(null != voltage220V) {int src = voltage220V.output220V();//獲取220v電壓dst = src / 44;}return dst;} }//調用(不變) public class Phone {public void charging(IVoltage5V iVoltage5V) {if(iVoltage5V.output5V() == 5) {System.out.println("電壓是5v,可以充電"); } else if (iVoltage5V.output5V() > 5) {System.out.println("電壓大于5v,不可充電");}} }//測試 public class Client {public static void main(String[] args) {System.out.println("===對象適配器===");Phone phone = new Phone();VoltageAdapter VoltageAdapter = new VoltageAdapter(new Voltage220V());phone.charging(VoltageAdapter);} }優缺點:
接口適配器
繼承那邊可以解耦了,那能不能從接口這邊解耦?
接口適配器也稱缺省適配器模式,適用于一個接口不想使用其所有的方法的情況。當不需要全部實現接口提供的方法時,可先設計一個抽象類實現接口,并為該接口中每個方法提供一個默認實現(空方法),那么該抽象類的子類可有選擇地覆蓋父類的某些方法來實現需求。
//被適配的類(不變) public class Voltage220V {public int output220V() {int src = 220;System.out.println("電壓=" + src);return src;} }//適配接口 public interface IVoltage5V {public int output5V();public void m2(); //接口里冗余不重要的方法public String m3(); } //抽象適配器 public abstract class AbsAdapter extends Voltage220V implements IVoltage5V{@Override //以空方法實現接口所有方法public int output5V() {return 0;}@Overridepublic void m2() {}@Overridepublic String m3() {return null;} }//調用(不變) public class Phone {public void charging(IVoltage5V iVoltage5V) {if(iVoltage5V.output5V() == 5) {System.out.println("電壓是5v,可以充電");} else if (iVoltage5V.output5V() > 5) {System.out.println("電壓大于5v,不可充電");}} }//測試 public class Client {public static void main(String[] args) {System.out.println("===接口適配器===");AbsAdapter absAdapter = new AbsAdapter() { //匿名內部類的形式@Override //按需要重寫接口方法public int output5V() {System.out.println("使用了output5V的方法");int srcV = output220V();int dstV = srcV / 44 ; //轉成5vreturn dstV;}};Phone phone = new Phone();phone.charging(absAdapter);} }
優缺點:
總結
以上三種形式是根據src是以怎樣的形式給到Adapter來命名的:
Adapter模式最大的作用還是將原本不兼容的接口融合在一起工作,在實際開發中,實現起來不拘泥于我們講解的三種經典形式。
原創不易,請勿轉載(本不富裕的訪問量雪上加霜 )
博主首頁:https://wzlodq.blog.csdn.net/
微信公眾號:吾仄lo咚鏘
如果文章對你有幫助,記得一鍵三連?
總結
以上是生活随笔為你收集整理的设计模式-适配器模式(类适配器、对象适配器、接口适配器详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: macOS High Sierra 10
- 下一篇: VBS隐藏bat窗口