Java設計模式系列-適配器模式


原創(chuàng)文章,轉載請標注出處:《Java設計模式系列-適配器模式》


一、概述

????????適配器就是一種適配中間件,它存在于不匹配的二者之間,用于連接二者,將不匹配變得匹配,簡單點理解就是平常所見的轉接頭,轉換器之類的存在。

????????適配器模式有兩種:類適配器、對象適配器、接口適配器。

????????前二者在實現(xiàn)上有些許區(qū)別,作用一樣,第三個接口適配器差別較大。

二、類適配器模式

2.1 原理

????????通過繼承來實現(xiàn)適配器功能

????????當我們要訪問的接口A中沒有我們想要的方法 ,卻在另一個接口B中發(fā)現(xiàn)了合適的方法,我們又不能改變訪問接口A,在這種情況下,我們可以定義一個適配器p來進行中轉,這個適配器p要實現(xiàn)我們訪問的接口A,這樣我們就能繼續(xù)訪問當前接口A中的方法(雖然它目前不是我們的菜),然后再繼承接口B的實現(xiàn)類BB,這樣我們可以在適配器P中訪問接口B的方法了,這時我們在適配器P中的接口A方法中直接引用BB中的合適方法,這樣就完成了一個簡單的類適配器。

????????詳見下方實例:我們以ps2與usb的轉接為例。

2.2 示例

????????ps2接口:Ps2

public interface Ps2 {
    void isPs2();
}

????????USB接口:Usb

public interface Usb {
    void isUsb();
}

????????USB接口實現(xiàn)類:Usber

public class Usber implements Usb {
    @Override
    public void isUsb() {
        System.out.println("USB口");
    }
}

????????適配器:Adapter

public class Adapter extends Usber implements Ps2 {
    @Override
    public void isPs2() {
        isUsb();
    }
}

????????測試方法:Clienter

public class Clienter {
    public static void main(String[] args) {
        Ps2 p = new Adapter();
        p.isPs2();
    }
}

????????執(zhí)行結果:

USB口

示例解析

????????我手中有個ps2插頭的設備,但是主機上只有usb插頭的插口,怎么辦呢?弄個轉換器,將ps2插頭轉換成為USB插頭就可以使用了。

  • 接口Ps2:描述ps2接口格式
  • 接口Usb:描述USB接口格式
  • 類Usber:是接口Usb的實現(xiàn)類,是具體的USB接口格式
  • Adapter:用于將ps2接口格式轉換成為USB接口格式

三、對象適配器模式

3.1 原理

????????通過組合來實現(xiàn)適配器功能。

????????當我們要訪問的接口A中沒有我們想要的方法 ,卻在另一個接口B中發(fā)現(xiàn)了合適的方法,我們又不能改變訪問接口A,在這種情況下,我們可以定義一個適配器p來進行中轉,這個適配器p要實現(xiàn)我們訪問的接口A,這樣我們就能繼續(xù)訪問當前接口A中的方法(雖然它目前不是我們的菜),然后在適配器P中定義私有變量C(對象)(B接口指向變量名),再定義一個帶參數(shù)的構造器用來為對象C賦值,再在A接口的方法實現(xiàn)中使用對象C調用其來源于B接口的方法。

????????詳見下方實例:我們仍然以ps2與usb的轉接為例。

3.2 示例

????????ps2接口:Ps2

public interface Ps2 {
    void isPs2();
}

????????USB接口:Usb

public interface Usb {
    void isUsb();
}

????????USB接口實現(xiàn)類:Usber

public class Usber implements Usb {
    @Override
    public void isUsb() {
        System.out.println("USB口");
    }
}

????????適配器:Adapter

public class Adapter implements Ps2 {
    private Usb usb;
    public Adapter(Usb usb){
        this.usb = usb;
    }
    @Override
    public void isPs2() {
        usb.isUsb();
    }
}

????????測試類:Clienter

public class Clienter {
    public static void main(String[] args) {
        Ps2 p = new Adapter(new Usber());
        p.isPs2();
    }
}

????????執(zhí)行結果:

USB口

示例解析

????????我手中有個ps2插頭的設備,但是主機上只有usb插頭的插口,怎么辦呢?弄個轉換器,將ps2插頭轉換成為USB插頭就可以使用了。

  • 接口Ps2:描述ps2接口格式
  • 接口Usb:描述USB接口格式
  • 類Usber:是接口Usb的實現(xiàn)類,是具體的USB接口格式
  • Adapter:用于將ps2接口格式轉換成為USB接口格式

四、接口適配器模式

4.1 原理

????????通過抽象類來實現(xiàn)適配,這種適配稍別于上面所述的適配。

????????當存在這樣一個接口,其中定義了N多的方法,而我們現(xiàn)在卻只想使用其中的一個到幾個方法,如果我們直接實現(xiàn)接口,那么我們要對所有的方法進行實現(xiàn),哪怕我們僅僅是對不需要的方法進行置空(只寫一對大括號,不做具體方法實現(xiàn))也會導致這個類變得臃腫,調用也不方便,這時我們可以使用一個抽象類作為中間件,即適配器,用這個抽象類實現(xiàn)接口,而在抽象類中所有的方法都進行置空,那么我們在創(chuàng)建抽象類的繼承類,而且重寫我們需要使用的那幾個方法即可。

4.2 示例

????????目標接口:A

public interface A {
    void a();
    void b();
    void c();
    void d();
    void e();
    void f();
}

????????適配器:Adapter

public abstract class Adapter implements A {
    public void a(){}
    public void b(){}
    public void c(){}
    public void d(){}
    public void e(){}
    public void f(){}
}

????????實現(xiàn)類:Ashili

public class Ashili extends Adapter {
    public void a(){
        System.out.println("實現(xiàn)A方法被調用");
    }
    public void d(){
        System.out.println("實現(xiàn)d方法被調用");
    }
}

????????測試類:Clienter

public class Clienter {
    public static void main(String[] args) {
        A a = new Ashili();
        a.a();
        a.d();
    }
}

五、適配器模式應用場景

5.1 類適配器與對象適配器使用場景

????????類適配器與對象適配器的使用場景一致,僅僅是實現(xiàn)手段稍有區(qū)別,二者主要用于如下場景:

  • 想要使用一個已經存在的類,但是它卻不符合現(xiàn)有的接口規(guī)范,導致無法直接去訪問,這時創(chuàng)建一個適配器就能間接去訪問這個類中的方法。
  • 我們有一個類,想將其設計為可重用的類(可被多處訪問),我們可以創(chuàng)建適配器來將這個類來適配其他沒有提供合適接口的類。

????????以上兩個場景其實就是從兩個角度來描述一類問題,那就是要訪問的方法不在合適的接口里,一個從接口出發(fā)(被訪問),一個從訪問出發(fā)(主動訪問)。

5.2 接口適配器使用場景

????????想要使用接口中的某個或某些方法,但是接口中有太多方法,我們要使用時必須實現(xiàn)接口并實現(xiàn)其中的所有方法,可以使用抽象類來實現(xiàn)接口,并不對方法進行實現(xiàn)(僅置空),然后我們再繼承這個抽象類來通過重寫想用的方法的方式來實現(xiàn)。這個抽象類就是適配器。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 適配器就是一種適配中間件,它存在于不匹配的二者之間,用于連接二者,將不匹配變得匹配,簡單點理解就是平常所見的轉接頭...
    小陳阿飛閱讀 315評論 0 0
  • 定義 適配器就是一種適配中間件,它存在于不匹配的二者之間,用于連接二者,將不匹配變得匹配,簡單點理解就是平常所見的...
    Cat9527閱讀 630評論 0 0
  • 我的筆記本電腦的工作電壓是20V,而我國的家庭用電是220V,如何讓20V的筆記本電腦能夠在220V的電壓下工作?...
    justCode_閱讀 1,507評論 0 5
  • 目錄 本文的結構如下: 什么是適配器模式 為什么要用該模式 模式的結構 代碼示例 優(yōu)點和缺點 適用環(huán)境 模式應用 ...
    w1992wishes閱讀 996評論 0 3
  • 【學習難度:★★☆☆☆,使用頻率:★★★★☆】直接出處:適配器模式梳理和學習:https://github.com...
    BruceOuyang閱讀 1,073評論 0 2

友情鏈接更多精彩內容