自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

適配器模式:如何讓不兼容的接口變得兼容

開發(fā) 前端
通過利用適配器模式對系統(tǒng)進(jìn)行擴(kuò)展后,我們就不必再為解決兼容性問題去暴力修改類接口了,轉(zhuǎn)而通過適配器,以更為優(yōu)雅、巧妙的方式將兩側(cè)“對立”的接口“整合”在一起,順利化解雙方難以調(diào)和的矛盾,最終使它們順利接通。

在軟件開發(fā)中,我們經(jīng)常會遇到這樣的情況:我們需要使用一個現(xiàn)有的類或者接口,但它與我們系統(tǒng)的目標(biāo)接口不兼容,而我們又不能修改它。這時候,我們該怎么辦呢?大多數(shù)情況下我們都可以使用適配器模式來解決這個問題,本文將從以下四個方面講解適配器模式。

  • 簡介
  • 優(yōu)缺點(diǎn)
  • 應(yīng)用場景
  • Java 代碼示例

簡介

適配器模式(Adapter Pattern)是一種結(jié)構(gòu)型設(shè)計模式,它可以將一個接口轉(zhuǎn)換成客戶端所期待的另一個接口,從而使原本由于接口不兼容而不能一起工作的類可以一起工作。適配器模式也稱為包裝器模式(Wrapper Pattern),因?yàn)樗ㄟ^一個包裝類(即適配器)來包裝不兼容的接口,并提供統(tǒng)一的目標(biāo)接口。適配器模式可以在運(yùn)行時根據(jù)需要選擇不同的適配器來適配不同的被適配者。

圖片

對象適配器模式的各角色定義如下。

  • Target(目標(biāo)接口):客戶端要使用的目標(biāo)接口標(biāo)準(zhǔn),對應(yīng)下文中的三相插孔接口 TriplePin。
  • Adapter(適配器):實(shí)現(xiàn)了目標(biāo)接口,負(fù)責(zé)適配(轉(zhuǎn)換)被適配者的接口 specificRequest()為目標(biāo)接口 request(),對應(yīng)本章下文中的電視機(jī)專屬適配器類 TriplePinAdapter。
  • Adaptee(被適配者):被適配者的接口標(biāo)準(zhǔn),目前不能兼容目標(biāo)接口的問題接口,可以有多種實(shí)現(xiàn)類,對應(yīng)下文中的兩相插孔接口 DualPin。
  • Client(客戶端):目標(biāo)接口的使用者。

優(yōu)缺點(diǎn)

適配器模式的優(yōu)點(diǎn)有:

  • 適配器模式可以增強(qiáng)程序的可擴(kuò)展性,通過使用適配器,可以在不修改原有代碼的基礎(chǔ)上引入新的功能或者接口。
  • 適配器模式可以提高類的復(fù)用性,通過使用適配器,可以將已有的類或者接口重新組合和封裝,使其符合新的需求。
  • 適配器模式可以增加類的透明度,通過使用適配器,客戶端只需要關(guān)注目標(biāo)接口,而無需了解被適配者的具體實(shí)現(xiàn)。
  • 適配器模式可以靈活地切換不同的被適配者,通過使用不同的適配器,可以動態(tài)地選擇不同的被適配者來滿足不同的場景。

適配器模式的缺點(diǎn)有:

  • 適配器模式會增加系統(tǒng)的復(fù)雜性,過多地使用適配器會使系統(tǒng)變得零亂和難以理解。
  • 適配器模式可能會降低系統(tǒng)的性能,因?yàn)槊看握{(diào)用目標(biāo)接口時都需要經(jīng)過適配器的轉(zhuǎn)換。
  • 適配器模式可能會違反開閉原則,如果目標(biāo)接口發(fā)生變化,則需要修改所有的適配器類。

應(yīng)用場景

適配器模式適用于以下場景:

  • 當(dāng)需要在一個已有系統(tǒng)中引入新的功能或者接口時,它與系統(tǒng)的目標(biāo)接口不兼容,但又不能修改原有代碼時,可以使用適配器模式。例如在一個數(shù)據(jù)庫操作系統(tǒng)中,如果想要支持多種類型的數(shù)據(jù)庫源,但系統(tǒng)只提供了一個固定類型數(shù)據(jù)庫源的操作接口時,可以使用一個數(shù)據(jù)庫源操作適配器來將不同類型數(shù)據(jù)庫源轉(zhuǎn)換成統(tǒng)一類型數(shù)據(jù)庫源。
  • 當(dāng)需要在多個獨(dú)立開發(fā)的系統(tǒng)或者組件之間進(jìn)行協(xié)作時,但由于各自采用了不同的接口或者協(xié)議時,可以使用適配器模式。例如在一個分布式服務(wù)系統(tǒng)中,如果想要讓不同語言編寫的服務(wù)之間進(jìn)行通信和調(diào)用,但各自采用了不同的通信協(xié)議和數(shù)據(jù)格式時,可以使用一個服務(wù)通信適配器來將不同協(xié)議和數(shù)據(jù)格式轉(zhuǎn)換成統(tǒng)一協(xié)議和數(shù)據(jù)格式。

Java 代碼示例

舉一個生活中常見的實(shí)例,我們新買了一臺電視機(jī),其電源插頭是兩相的,不巧的是墻上的插孔卻是三相的,這時電視機(jī)便無法通電使用,我們以代碼來重現(xiàn)這個場景。

  1. 定義目標(biāo)接口:三相插口 TriplePin,其中 3 個參數(shù) l、n、e 分別對應(yīng)火線(live)、零線(null)和地線(earth)。
public interface TriplePin {

    public void electrify(int l, int n, int e);
}
  1. 定義被適配者接口:兩項(xiàng)插口 DualPin,可以看到參數(shù)中缺少了地線 e 參數(shù)。
public interface DualPin {

    public void electrify(int l, int n);
}
  1. 添加被適配者接口具體實(shí)現(xiàn)類:TV,可以看到 TV 實(shí)現(xiàn)的是兩相接口,所在無法直接在三項(xiàng)接口中使用。
public class TV implements DualPin {
    @Override
    public void electrify(int l, int n) {
        System.out.println("火線通電:" + l + ",零線通電:" + n);
        System.out.println("電視開機(jī)");
    }
}
  1. 定義適配器類:三項(xiàng)接口適配器 TriplePinAdapter,實(shí)現(xiàn)了三項(xiàng)接口并且包含兩項(xiàng)接口屬性,在 electrify 方法中調(diào)用被適配設(shè)備的兩插通電方法,忽略地線參數(shù) e,以此來完成三項(xiàng)接口對兩項(xiàng)接口的兼容。

這也就意味著 TriplePinAdapter 類能幫助我們將 TV 類與三項(xiàng)接口兼容。

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) {
        // 調(diào)用被適配設(shè)備的兩插通電方法,忽略地線參數(shù)e
        dualPin.electrify(l, n);
    }
}
  1. 定義客戶端類
public class Client {

    public static void main(String[] args) {
        DualPin dualPinDevice = new TV();
        TriplePin triplePinDevice = new TriplePinAdapter(dualPinDevice);
        triplePinDevice.electrify(1, 0, -1);
    }
}

輸出結(jié)果如下:

火線通電:1,零線通電:0
電視開機(jī)

總結(jié)

圖片

通過利用適配器模式對系統(tǒng)進(jìn)行擴(kuò)展后,我們就不必再為解決兼容性問題去暴力修改類接口了,轉(zhuǎn)而通過適配器,以更為優(yōu)雅、巧妙的方式將兩側(cè)“對立”的接口“整合”在一起,順利化解雙方難以調(diào)和的矛盾,最終使它們順利接通。

責(zé)任編輯:武曉燕 來源: waynblog
相關(guān)推薦

2022-03-28 08:21:49

適配器模式項(xiàng)目升級接口

2020-10-25 08:56:21

適配器模式

2022-02-13 23:33:24

設(shè)計模式Java

2013-11-26 16:39:21

Android設(shè)計模式

2021-02-18 08:39:28

設(shè)計模式場景

2012-05-16 17:22:11

Java設(shè)計模式

2022-02-18 17:21:29

適配器模式客戶端

2012-08-02 10:46:34

JavaAdapter模式

2021-02-16 08:16:09

適配器模式MybatisJava

2009-11-18 18:08:20

PHP適配器模式

2023-08-15 11:07:37

適配器模式TypeScript

2024-02-22 12:13:49

適配器模式代碼

2012-04-12 09:33:02

JavaScript

2024-07-31 10:41:16

C#設(shè)計模式

2024-04-10 12:27:43

Python設(shè)計模式開發(fā)

2013-02-26 10:55:47

C#適配器設(shè)計模式

2022-12-12 09:20:59

適配器模式接口

2012-09-19 15:29:26

Worklight適配器

2022-05-29 22:55:00

適配器設(shè)計模式

2021-07-26 07:32:48

模式適配器包裝器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號