結構型模式——介面卡模式
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.應用場景
- 系統需要使用現有的類,而這些類的介面不符合系統的需要。
- 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作
相關文章
- 結構型模式:介面卡模式模式
- 設計模式(十)----結構型模式之介面卡模式設計模式
- 設計模式詳解之結構型設計模式——介面卡、裝飾器設計模式
- 初探Java設計模式2:結構型模式(代理模式,介面卡模式等)Java設計模式
- 結構型模式之介面卡模式、橋接模式與裝飾器模式(一)模式橋接
- 結構型:策略模式模式
- 結構型-代理模式模式
- 設計模式之代理模式(結構型)設計模式
- 結構型設計模式設計模式
- iOS模式分析 使用介面卡模式重構TableViewiOS模式View
- 結構型-裝飾器模式模式
- (Java)設計模式:結構型Java設計模式
- 8.結構型-組合模式模式
- 設計模式--介面卡模式/代理模式設計模式
- 設計模式:介面卡模式設計模式
- 設計模式-介面卡模式設計模式
- 設計模式----介面卡模式設計模式
- 【設計模式】介面卡模式設計模式
- 【設計模式自習室】結構型:組合模式 Composite設計模式
- 聊一聊設計模式(三)-- 結構型設計模式設計模式
- 結構性設計模式(四)介面卡模式【如何把方的變成圓的】設計模式
- 設計模式系列之介面卡模式(Adapter Pattern)——不相容結構的協調設計模式APT
- 結構型模式:代理模式模式
- 介面卡模式模式
- 大話 PHP 設計模式--結構型PHP設計模式
- 物件導向-設計模式-結構型物件設計模式
- JAVA設計模式 5【結構型】代理模式的理解與使用Java設計模式
- python 設計模式-介面卡模式Python設計模式
- 設計模式之介面卡模式設計模式
- JavaScript 設計模式 —— 介面卡模式JavaScript設計模式
- java設計模式-介面卡模式Java設計模式
- 設計模式(七)介面卡模式設計模式
- 設計模式(五):介面卡模式設計模式
- 設計模式之【介面卡模式】設計模式
- 結構型模式:外觀模式模式
- 結構型模式:橋接模式模式橋接
- 結合案例深入解析介面卡模式(二)模式
- 設計者模式之介面卡模式模式
- PHP設計模式-Adapter 介面卡模式PHP設計模式APT