結構型模式——介面卡模式

pszh發表於2016-12-19

1.由來

客戶端可以通過目標類的介面訪問它所提供的服務。有時,現有的類可以滿足客戶類的功能需要,但是它所提供的介面不一定是客戶類所期望的,現有的介面需要轉化為客戶類期望的介面,這樣保證了對現有類的重用。

看圖吧,能跟好的理解:

      

      


2.定義

介面卡模式(Adapter Pattern) :將一個介面轉換成客戶希望的另一個介面,介面卡模式使介面不相容的那些類可以一起工作,其別名為包裝器(Wrapper)。介面卡模式既可以作為類結構型模式,也可以作為物件結構型模式。


3.程式碼的實現

這裡又分為兩種實現方式:

     (1)類的介面卡模式(採用繼承實現)

// 已存在的、具有特殊功能、但不符合我們既有的標準介面的類  
class Adaptee {  
    public void specificRequest() {  
        System.out.println("被適配類具有 特殊功能...");  
    }  
}  
  
// 目標介面,或稱為標準介面  
interface Target {  
    public void request();  
}  
  
// 具體目標類,只提供普通功能  
class ConcreteTarget implements Target {  
    public void request() {  
        System.out.println("普通類 具有 普通功能...");  
    }  
}  
   
// 介面卡類,繼承了被適配類,同時實現標準介面  
class Adapter extends Adaptee implements Target{  
    public void request() {  
        super.specificRequest();  
    }  
}  
   
// 測試類public class Client {  
    public static void main(String[] args) {  
        // 使用普通功能類  
        Target concreteTarget = new ConcreteTarget();  
        concreteTarget.request();  
          
        // 使用特殊功能類,即適配類  
        Target adapter = new Adapter();  
        adapter.request();  
    }  
}  


     (2)物件介面卡(採用物件組合方式實現)

// 介面卡類,直接關聯被適配類,同時實現標準介面  
class Adapter implements Target{  
    // 直接關聯被適配類  
    private Adaptee adaptee;  
      
    // 可以通過建構函式傳入具體需要適配的被適配類物件  
    public Adapter (Adaptee adaptee) {  
        this.adaptee = adaptee;  
    }  
      
    public void request() {  
        // 這裡是使用委託的方式完成特殊功能  
        this.adaptee.specificRequest();  
    }  
}  
  
// 測試類  
public class Client {  
    public static void main(String[] args) {  
        // 使用普通功能類  
        Target concreteTarget = new ConcreteTarget();  
        concreteTarget.request();  
          
        // 使用特殊功能類,即適配類,  
        // 需要先建立一個被適配類的物件作為引數  
        Target adapter = new Adapter(new Adaptee());  
        adapter.request();  
    }  
}  

個人感覺兩種方式 還是差不多。

4.模式的優點

  • 將目標類和適配者類解耦,通過引入一個介面卡類來重用現有的適配者類,而無須修改原有程式碼。
  • 增加了類的透明性和複用性,將具體的實現封裝在適配者類中,對於客戶端類來說是透明的,而且提高了適配者的複用性。
  • 靈活性和擴充套件性都非常好,通過使用配置檔案,可以很方便地更換介面卡,也可以在不修改原有程式碼的基礎上增加新的介面卡類,完全符合“開閉原則”。
類介面卡模式還具有如下優點:
由於介面卡類是適配者類的子類,因此可以在介面卡類中置換一些適配者的方法,使得介面卡的靈活性更強。
物件介面卡模式還具有如下優點:
一個物件介面卡可以把多個不同的適配者適配到同一個目標,也就是說,同一個介面卡可以把適配者類和它的子類都適配到目標介面。

5.模式的缺點


類介面卡模式的缺點如下: 對於Java、C#等不支援多重繼承的語言,一次最多隻能適配一個適配者類,而且目標抽象類只能為抽象類,不能為具體類,其使用有一定的侷限性,不能將一個適配者類和它的子類都適配到目標介面。 物件介面卡模式的缺點如下: 與類介面卡模式相比,要想置換適配者類的方法就不容易。如果一定要置換掉適配者類的一個或多個方法,就只好先做一個適配者類的子類,將適配者類的方法置換掉,然後再把適配者類的子類當做真正的適配者進行適配,實現過程較為複雜。

6.應用場景

  • 系統需要使用現有的類,而這些類的介面不符合系統的需要。
  • 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作


相關文章