將一個類的接口轉成客戶指望的另一個接口。適配器模式使得本來因爲接口不匹配而不能一塊兒工做的那些類能夠一塊兒工做。html
適配器模式就像旅行插座轉換器(圖1)、Type-c轉VGA轉接口(圖4)同樣。java
圖1. 圖片來源網絡設計模式
圖2. 圖片來源網絡網絡
去過香港迪拜等的同窗都知道,那邊用的插座跟咱們不同,他們的插座須要如圖2第1面所示的插頭,而咱們經常使用的插座相似第2面。所以咱們的筆記本電腦,手機在當地不能直接充電。因此就須要一個插座轉換器,轉換器第1面插入當地的插座,第2面供咱們充電,這樣使得咱們的插頭在當地能使用。Type-c轉VGA轉接口也是同樣的道理。mybatis
圖3. 適配模式結構圖 來源網絡ide
如圖所示,Client不能直接訪問Adaptee。Adapter是適配器,它將Adaptee轉換成Client能訪問的接口。因此經過適配器Adapter,用戶端就能夠訪問Adaptee。post
手機想要投影到投影儀上,因爲手機是Type-c接口,投影儀是VGA接口。不能直接投影,須要一個適配器,將視頻信號從Type-c口轉到VGA口,最後才能輸出到大屏幕上。測試
圖4. typec轉vga/hdm轉換器this
如圖所示,這有一個適配器,一號口是typec口,二號口是vga口,只有將視頻信號從typec口輸入,轉換輸出到vga口,才能和投影儀對接,實現手機屏幕投影到投影儀上的任務。涉及的物品有:手機、適配器、投影儀。url
4.1 定義一個手機,它有個typec口,這是視頻源。
package com.jstao.adapter; /** * @author jstao * 定義一個手機Phone,它有一個Typec接口。 * */ public class Phone { public void typecPhone() { System.out.println("信息從Typec口的手機輸出。"); } }
4.2 定義一個vga接口
package com.jstao.adapter; /** * @author jstao * 定義一個VGA接口。 * */ public interface Vga { void vgaInterface(); }
4.3 實現一個適配器,適配器實現方式分三類:類的適配器模式、對象的適配器模式、接口的適配器模式。
4.3.1 類的適配器模式
原理:經過繼承特性來實現適配器功能。
package com.jstao.adapter; /** * * 實現一個Type-c轉VGA適配器, * 適配器實現方式有三種,這是第一種實現方式。 * @author jstao * */ public class Typec2Vga1 extends Phone implements Vga{ @Override public void vgaInterface() { // TODO Auto-generated method stub typecPhone(); System.out.println("接收到Type-c口信息,信息轉換成VGA接口中..."); System.out.println("信息已轉換成VGA接口,顯示屏能夠對接。"); } }
4.3.2 對象的適配器模式
原理:經過組合方式來實現適配器功能。
package com.jstao.adapter; /** * * 實現一個Type-c轉VGA適配器, * 適配器實現方式有三種,這是第二種實現方式。 * @author jstao * */ public class Typec2Vga2 implements Vga{ private Phone phone; public Typec2Vga2(Phone phone) { // TODO Auto-generated constructor stub this.phone = phone; } @Override public void vgaInterface() { // TODO Auto-generated method stub if(phone != null) { phone.typecPhone(); System.out.println("接收到Type-c口信息,信息轉換成VGA接口中..."); System.out.println("信息已轉換成VGA接口,顯示屏能夠對接。"); } } }
4.3.3 接口的適配器模式
原理:藉助抽象類來實現適配器功能。
定義三個接口
package com.jstao.adapter; /** * 定義接口 * @author jstao * */ public interface Target { void typec(); void typec2vga(); void typec2hdmi(); }
定義一個抽象類
package com.jstao.adapter; /** * 定義一個抽象類 * @author jstao * */ public abstract class Adapter implements Target{ public void typec() { } public void typec2vga() { } public void typec2hdmi() { } }
實現一個VGA適配器
package com.jstao.adapter; /** * * 實現一個VGA適配器,同理還能夠實現一個HDMI適配器 * 適配器實現方式有三種,這是第三種實現方式。 * @author jstao * */ public class VgaAdapter extends Adapter{ public void typec() { System.out.println("信息從Typec口的手機輸出。"); } public void typec2vga() { System.out.println("接收到Type-c口信息,信息轉換成VGA接口中..."); System.out.println("信息已轉換成VGA接口,顯示屏能夠對接。"); } }
4.4 定義一個顯示屏,用來測試上面實現的三個適配器
package com.jstao.adapter; /** * 定義一個顯示屏 * 與適配器對接 * @author jstao * */ public class Screen { public static void main(String[] args) { //第一種適配器用法 System.out.println("-------------第一種適配器------------"); Vga vga = new Typec2Vga1(); vga.vgaInterface();//適配器將typec轉換成vga System.out.println("顯示屏對接適配器,手機成功投影到顯示屏!"); //第二種適配器用法 System.out.println("-------------第二種適配器------------"); Typec2Vga2 typec2Vga1 = new Typec2Vga2(new Phone()); typec2Vga1.vgaInterface();//適配器將typec轉換成vga System.out.println("顯示屏對接適配器,手機成功投影到顯示屏!"); //第三種適配器用法 System.out.println("-------------第三種適配器------------"); VgaAdapter vgaAdapter = new VgaAdapter(); vgaAdapter.typec(); vgaAdapter.typec2vga();//適配器將typec轉換成vga System.out.println("顯示屏對接適配器,手機成功投影到顯示屏!"); } }
4.5 測試結果
圖5. 結果輸出圖
能夠看到,獲得的結果都同樣,可是三種適配器的實現的方式卻不相同。
5.1 適配器模式在源碼中的應用:
(1)JDK源碼的IO模塊用到,例如 java.io.InputStreamReader(InputStream)、java.io.OutputStreamWriter(OutputStream)。
(2)mybatis源碼日誌模塊用到對象適配器模式。
5.1 適配器模式將一個接口轉爲另一個接口。它有三種實現方式:
(1)當但願將一個類轉換爲知足另外一個新接口的類時,可使用類的適配器模式,建立一個新類,繼承原有的類,實現新的接口便可,例如4.3.1。
(2) 當但願將一個對象轉換成知足另外一個新接口的對象時,能夠建立一個Typec2Vga2 類,持有原類的一個實例,在Typec2Vga2 類的方法中,調用實例的方法就行,例如4.3.2對象的適配器模式。
(3)當不但願實現一個接口中全部的方法時,能夠建立一個抽象類Adapter ,實現全部方法,咱們寫別的類的時候,繼承抽象類便可,例如4.3.3接口的適配器模式。
你的支持也是個人動力,最後筆記對你有用,別忘了點贊支持下哦。