適配器模式屬於結構型模式的一種,用電器作例子,筆記本電腦的插頭通常都是三相的,即除了陽極、陰極外,還有一個地極。而有些地方的電源插座卻只有倆極,沒有地極。電源插座與筆記本電腦的電源插頭不匹配使得筆記本電腦沒法充電。這時候一個三相到倆相的轉換器(適配器)就能解決此問題,而這正像是本模式所作的事情。適配器模式主要有倆種類型,類適配器模式和對象適配器模式,因爲類適配器模式經過多重繼承對一個接口與另外一個接口進行匹配,而JAVA並不支持多繼承,也就是一個類只能有一個父類,因此咱們這裏主要講的是對象適配器。git
結構型模式是將系統中的多個類或對象組合在一塊兒,相互協做來完成更復雜的任務或功能。就比如搭積木,許多簡單積木能夠搭建成更復雜、功能更強大的結構。它分爲倆種形式:類結構型模式和對象結構性模式。類結構型模式由多個類組合,存在繼承和實現關係;對象結構型模式由類和對象組合,存在關聯關係(好比車和車胎的關係)。github
下面咱們再介紹下適配器模式:編程
1.定義:將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。測試
2.模式結構圖:
this
(1)Target(目標抽象類):定義了特定的工做接口。spa
(2)Adapter(適配器類):模式的核心類,做業轉換器對Target和Adapter進行適配。code
(3)Adaptee(適配者類):定義了須要適配的接口。對象
(4)Client(客戶類):針對目標抽象類編程,調用其定義的方法。blog
3.案例分析:繼承
目標抽象類Rebot
package com.lwx.adapter; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-04-13 * Time: 18:34 */ public interface Robot { void cry(); void move(); }
須要適配的類Dog
package com.lwx.adapter; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-04-13 * Time: 18:36 */ public class Dog { public void shout() { System.out.println("狗能夠汪汪叫..."); } public void run() { System.out.println("狗能夠跑..."); } }
適配器類DogAdapter
package com.lwx.adapter; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-04-13 * Time: 18:37 */ public class DogAdapter implements Robot { private Dog dog; public DogAdapter(Dog dog) { this.dog = dog; } public void cry() { System.out.print("機器人模仿:"); dog.shout(); } public void move() { System.out.print("機器人模仿:"); dog.run(); } }
最後是測試類,以及運行結果
package com.lwx.adapter; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-04-13 * Time: 18:38 */ public class Client { public static void main(String[] args) { Robot dogAdapter = new DogAdapter(new Dog()); dogAdapter.cry(); dogAdapter.move(); } }
四、模式優缺點:
優勢:將目標類和適配者類解耦,更換添加適配器方便簡單增長了類的複用性。
缺點:類適配器一次只能適配一個適配者類,目標抽象類只能爲接口,具備必定的侷限性;對象適配器模式很難置換適配者類的方法。
五、模式應用:
適配器模式主要應用於但願複用一些現存的類,可是接口又與複用環境要求不一致的狀況;就是雙方都不太容易修改時就能夠考慮使用該模式。
最後附上demo的githup地址:https://github.com/yijinqincai/design_patterns