定義:適配器模式將某個類的接口轉(zhuǎn)換成客戶端期望的另一個接口表示晒哄,主的目的是兼容性紧显,讓原本因接口不匹配不能一起工作的兩個類可以協(xié)同工作撇他。其別名為包裝器(Wrapper)议慰。
屬于結(jié)構(gòu)型模式
主要分為三類:類適配器模式、對象的適配器模式辕棚、接口的適配器模式
自定義場景:
唱歌欲主、跳舞兩件事不能同時實現(xiàn)邓厕。
類適配器模式
自定義場景:
唱歌是接口、跳舞是類扁瓢;-
一句話解釋:
Wrapper 類详恼,通過繼承 Dance 類,實現(xiàn) Sing 類接口引几,完成Dance ->Sing 的適配昧互;
類適配器.png -
代碼:
//唱歌 public interface Sing { public String doSing(); } //跳舞 public class Dance { public String doDance() { return "doDance"; } } //唱跳 public class Wrapper extends Dance implements Sing { @Override public String doSing() { return "doSing and " + doDance(); } public static void main(String[] args) { Wrapper wrapper = new Wrapper(); System.out.print(wrapper.doSing()); } }
對象適配器模式
自定義場景:
唱歌是接口、跳舞是類伟桅;-
一句話解釋:
Wrapper 類敞掘,通過持有 Dance 類(可換成使用反射),實現(xiàn) Sing 類接口楣铁,完成Dance ->Sing 的適配玖雁;
對象適配器.jpg
注意:Wrapper中持有Dance類在UML中沒顯示;
-
代碼:
//唱歌 public interface Sing { public String doSing(); } //跳舞 public class Dance { public String doDance() { return "doDance"; } } //唱跳 //對象適配器 public class Wrapper implements Sing { private Dance dance; public Wrapper(Dance dance) { this.dance = dance; } @Override public String doSing() { return "對象適配器:doSing and " + dance.doDance(); } public static void main(String[] args) { Wrapper wrapper = new Wrapper(new Dance()); System.out.print(wrapper.doSing()); } }
接口適配器模式
自定義場景:
唱歌是接口(多個方法)盖腕;MySing只想用唱中的一種方法赫冬;N句話解釋:
通過抽象類來實現(xiàn)適配;
當(dāng)存在這樣一個接口溃列,其中定義了很多很多方法劲厌;而我們現(xiàn)在卻只想使用其中的一個到幾個方法,如果我們直接實現(xiàn)接口听隐,那么我們要對所有的方法進(jìn)行實現(xiàn)补鼻,就算我們對不需要的方法進(jìn)行置空(只寫一對大括號,不作具體方法實現(xiàn))也會導(dǎo)致著這個類變得臃腫雅任,調(diào)用不便风范。這時我們可以使用一個抽象類作為適配器,用這個抽象類實現(xiàn)接口椿访,而在抽象類中所有方法都進(jìn)行置空乌企;那么我們在創(chuàng)建抽象類的繼承類虑润,而且只重寫我們需要使用的那幾個方法就行成玫。
-
代碼:
//有多個唱歌方法的接口 public interface Sing { public String doSing(); public String doSingA(); public String doSingB(); } //接口適配器 abstract class Wrapper implements Sing { public String doSing() { return null; } public String doSingA() { return null; } public String doSingB() { return null; } } //適配器的使用,只用一個方法 public class MySing extends Wrapper { //我在使用第一種唱歌方法的時候拳喻,就不需要把其他方法也實現(xiàn)哭当; @Override public String doSing() { return "只用一種唱歌"; } }
感謝網(wǎng)友的分分享:
https://blog.csdn.net/u013276277/article/details/78394756
https://blog.csdn.net/zxt0601/article/details/52848004
https://blog.csdn.net/psp0001060/article/details/50738580