2019年阿里雲雙11活動拼團:https://www.aliyun.com/1111/2019/group-buying-share
適配器模式屬於結構型模式的一種,它可以理解爲現實生活中的電源適配器、網絡適配器等。首先要搞清楚什麼是結構型模式。
結構型模式是將系統中的多個類或對象組合在一起,相互協作來完成更復雜的任務或功能。就好比搭積木,許多簡單積木可以搭建成更復雜、功能更強大的結構。它分爲兩種形式:類結構型模式和對象結構型模式。類結構型模式由多個類組合,存在繼承和實現關係;對象結構型模式由類和對象組合,存在關聯關係(比如車和輪胎的關係)。
下面我們再介紹適配器模式:
1、定義:將一個類的接口轉化成多個類可以兼容的接口,使其協同工作而無需修改現有類的內部結構。
2、模式結構:
(1)Target(目標抽象類):定義了特定的工作接口。
(2)Adapter(適配器類):模式的核心類,作爲轉換器對Target和Adaptee進行適配。
(3)Adaptee(適配者類):定義了需要適配的接口。
(4)Client(客戶類):針對目標抽象類編程,調用其定義的方法。
3、類適配器和對象適配器的比較:
類適配器中,適配器類通過實現Target接口並繼承Adaptee類,實現適配目的。
public class Adapter extends Adaptee implements Target
{
//request()方法爲Target接口裏所定義的方法
public void request()
{
specificRequest();//該方法爲Adaptee類裏定義的方法
}
}
對象適配器中,適配器類通過繼承Target類並關聯一個Adaptee對象,實現適配目的。
public class Adapter extends Target
{
private Adaptee adaptee;//所關聯的適配者類的對象
public Adapter(Adaptee adaptee)
{
this.adaptee=adaptee;
}
public void request()
{
adaptee.specificRequest();
}
}
4、案例分析:(機器人)使用的是類適配器模式
(1)目標抽象類 Robot
public interface Robot
{
public void cry();
public void move();
}
(2)適配者類 Dog
public class Dog
{
public void shout()
{
System.out.println("狗可以汪汪叫!");
}
public void run()
{
System.out.println("狗可以跑!");
}
}
(3)適配器類 DogAdapte
public class DogAdapter extends Dog implements Robot
{
public void cry(){
System.out.print("機器人模仿:");
super.shout();
}
public void move(){
System.out.print("機器人模仿:");
super.run();
}
}
5、模式優缺點:
(1)優點:將目標類和適配者類解耦,更換添加適配器方便簡單,增加了類的複用性。
(2)缺點:類適配器模式一次只能適配一個適配者類,目標抽象類只能爲接口,具有一定的侷限性;對象適配器模式很難置換適配者類的方法。
6、模式應用:
(1)通過 JDBC 連接數據庫時加載數據庫驅動利用了適配器模式。不同數據庫的驅動都是介於 JDBC 接口和數據庫引擎接口(如Oracle)之間的適配器軟件。
(2)框架 Spring 的組成之一 Spring AOP 中,BeforeAdvice、AfterAdvice、ThrowsAdvice 三種通知類型是藉助適配器模式實現的,AdvisorAdapter 是一個適配器接口,源碼如下:
public interface AdvisorAdapte
{
//將一個 Advisor 適配成 MethodIntercepto
MethodInterceptor getInterceptor(Advisor advisor);
//判斷此適配器是否支持特定的 Advice
boolean supportsAdvice(Advice advice);
}
(3)JDK類庫中n的一些適配器類,如 InputStreamAdapter 類用於包裝 ImageInputStream 接口及其子類對象,使用對象適配器模式。