天天看點

Java結構型模式(1)擴充卡模式

《2020年阿裡雲活動拼團》: https://www.aliyun.com/minisite/goods?userCode=czfmwdn3 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=czfmwdn3 【限時】1年86元,3年229元,用來建站和程式設計學習【 附WordPress建站教程

擴充卡模式屬于結構型模式的一種,它可以了解為現實生活中的電源擴充卡、網絡擴充卡等。首先要搞清楚什麼是結構型模式。

結構型模式是将系統中的多個類或對象組合在一起,互相協作來完成更複雜的任務或功能。就好比搭積木,許多簡單積木可以搭建成更複雜、功能更強大的結構。它分為兩種形式:類結構型模式和對象結構型模式。類結構型模式由多個類組合,存在繼承和實作關系;對象結構型模式由類和對象組合,存在關聯關系(比如車和輪胎的關系)。

下面我們再介紹擴充卡模式:

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