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(){
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 接口及其子類對象,使用對象擴充卡模式。