在軟體開發中,我們經常會遇到這樣的情況:我們需要使用一個現有的類或者介面,但它與我們系統的目標介面不相容,而我們又不能修改它。這時候,我們該怎麼辦呢?大多數情況下我們都可以使用介面卡模式來解決這個問題,本文將從以下四個方面講解介面卡模式。
介面卡模式(Adapter Pattern)是一種結構型設計模式,它可以將一個介面轉換成使用者端所期待的另一個介面,從而使原本由於介面不相容而不能一起工作的類可以一起工作。介面卡模式也稱為包裝器模式(Wrapper Pattern),因為它通過一個包裝類(即介面卡)來包裝不相容的介面,並提供統一的目標介面。介面卡模式可以在執行時根據需要選擇不同的介面卡來適配不同的被適配者。
物件介面卡模式的各角色定義如下。
推薦博主開源的 H5 商城專案waynboot-mall,這是一套全部開源的微商城專案,包含三個專案:運營後臺、H5 商城前臺和伺服器端介面。實現了商城所需的首頁展示、商品分類、商品詳情、商品 sku、分詞搜尋、購物車、結算下單、支付寶/微信支付、收單評論以及完善的後臺管理等一系列功能。 技術上基於最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中介軟體。分模組設計、簡潔易維護,歡迎大家點個 star、關注博主。
github 地址:https://github.com/wayn111/waynboot-mall
介面卡模式的優點有:
介面卡模式的缺點有:
介面卡模式適用於以下場景:
舉一個生活中常見的範例,我們新買了一臺電視機,其電源插頭是兩相的,不巧的是牆上的插孔卻是三相的,這時電視機便無法通電使用,我們以程式碼來重現這個場景。
public interface TriplePin {
public void electrify(int l, int n, int e);
}
public interface DualPin {
public void electrify(int l, int n);
}
public class TV implements DualPin {
@Override
public void electrify(int l, int n) {
System.out.println("火線通電:" + l + ",零線通電:" + n);
System.out.println("電視開機");
}
}
這也就意味著 TriplePinAdapter 類能幫助我們將 TV 類與三項介面相容。
public class TriplePinAdapter implements TriplePin {
private DualPin dualPin;
public TriplePinAdapter(DualPin dualPin) {
this.dualPin = dualPin;
}
@Override
public void electrify(int l, int n, int e) {
// 呼叫被適配裝置的兩插通電方法,忽略地線引數e
dualPin.electrify(l, n);
}
}
public class Client {
public static void main(String[] args) {
DualPin dualPinDevice = new TV();
TriplePin triplePinDevice = new TriplePinAdapter(dualPinDevice);
triplePinDevice.electrify(1, 0, -1);
}
}
輸出結果如下:
火線通電:1,零線通電:0
電視開機
通過利用介面卡模式對系統進行擴充套件後,我們就不必再為解決相容性問題去暴力修改類介面了,轉而通過介面卡,以更為優雅、巧妙的方式將兩側「對立」的介面「整合」在一起,順利化解雙方難以調和的矛盾,最終使它們順利接通。
關注公眾號【waynblog】每週分享技術乾貨、開源專案、實戰經驗、國外優質文章翻譯等,您的關注將是我的更新動力!