亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java結(jié)構(gòu)型設計模式之適配器模式詳解

 更新時間:2022年09月22日 10:33:38   作者:丨Jack_Chen丨  
適配器模式,即將某個類的接口轉(zhuǎn)換成客戶端期望的另一個接口的表示,主要目的是實現(xiàn)兼容性,讓原本因為接口不匹配,沒辦法一起工作的兩個類,可以協(xié)同工作。本文將通過示例詳細介紹適配器模式,需要的可以參考一下

適配器模式

適配器模式(Adapter Pattern)又叫做變壓器模式,屬于結(jié)構(gòu)型設計模式。

它的功能是將一個類的接口變成客戶端所期望的另一種接口,從而使原本因接口不匹配而導致無法在一起工作的兩個類能夠一起工作。

適配器就像一個中間層,起著轉(zhuǎn)化委托的作用,將一種接口轉(zhuǎn)化為另一種符合需求的接口。

分類

適配器模式有3種形式:類適配器、對象適配器、接口適配器

類適配器:

類適配器的原理就是通過繼承來實現(xiàn)適配器功能。

對象適配器:

對象適配器的原理就是通過組合來實現(xiàn)適配器功能。

接口適配器:

接口適配器的主要原理就是原理利用抽象類實現(xiàn)接口,并且空實現(xiàn)接口眾多方法。

應用場景

1.已經(jīng)存在的類,它的方法和需求不匹配(方法結(jié)果相同或相以)的情況。

2.適配器模式不是軟件設計階段考慮的設計模式,是隨著軟件維護,由于不同產(chǎn)品、不同廠家造成功能類似以而接口不相同情況下的解決方案。

說明:

當系統(tǒng)存在兩種接口A和B,客戶端只支持訪問A接口,但是當前系統(tǒng)沒有A接口對象,但是有B接口對象,但客戶無法識別B接口,因此需要通過一個適配器C,將B接口內(nèi)容轉(zhuǎn)換成A接口,從而使得客戶能夠從A接口獲取得到B接口內(nèi)容。

舉例:在不同的國家電源電壓不一致,但是筆記本充電器通常有一個電壓范圍,其相當于使用了適配器,讓其適應了不通過國家的電壓。

優(yōu)缺點

優(yōu)點:

1.能提高類的透明性和復用,現(xiàn)有的類復用但不需要改變。

2.目標類和適配器類解耦,提高程序的擴展性。

3.在很多業(yè)務場景中符合開閉原則。

缺點:

1.適配器編寫過程需要全面考慮,可能會增加系統(tǒng)的復雜性。

2.增加代碼閱讀難度,降低代碼可讀性,過多使用適配器會使系統(tǒng)代碼變得凌亂。

主要角色

1.目標角色(Target)

目標角色也就是期望的接口

2.源角色(Adaptee)

存在于系統(tǒng)中,內(nèi)容滿足客戶需求(需轉(zhuǎn)換),但接口不匹配的接口實例

3.適配器(Adapter)

將源角色(Adaptee)轉(zhuǎn)化為目標角色(Target)的類實例

適配器模式各角色之間的關系

需要的是Target接口,但Target接口設有一個實例符合需求,而Adaptee實例符合需求;但是無法直接使用Adaptee(接口不兼容);因此需要一個適配器(Adapter)來進行中轉(zhuǎn),讓Adaptee能轉(zhuǎn)化為Target接口形式;

類適配器

類適配器的原理就是通過繼承來實現(xiàn)適配器功能。

讓Adapter實現(xiàn)Target接口,并且繼承Adaptee,這樣Adapter就具備Target和Adaptee的特性,就可以將兩者進行轉(zhuǎn)化。

舉例:以不同設備使用不同交流電為例,通過電源適配器進行轉(zhuǎn)換說明。

創(chuàng)建目標角色(Target)

public interface Target {
    int out();
}

創(chuàng)建源角色(Adaptee)

public class Adaptee{
    public int input() {
        System.out.println("輸入交流電: 220V");
        return 220;
    }
}

創(chuàng)建適配器(Adapter)

public class Adapter extends Adaptee implements Target {
    @Override
    public int out() {
        int input220V = super.input();
        int output = input220V / 2;
        System.out.println("輸出交流電: " + output + "V");
        return output;
    }
}

客戶端調(diào)用

    public static void main(String[] args) {
        Target adapter = new Adapter();
        int result = adapter.out();
        System.out.println(result);
    }

輸入交流電: 220V
輸出交流電: 110V
110

對象適配器

對象適配器的原理就是通過組合來實現(xiàn)適配器功能。

讓Adapter實現(xiàn)Target接口,然后內(nèi)部持有Adaptee實例,然后再Target接口規(guī)定的方法內(nèi)轉(zhuǎn)換Adaptee。

創(chuàng)建目標角色(Target)

public interface Target {
    int out();
}

創(chuàng)建源角色(Adaptee)

public class Adaptee{
    public int input() {
        System.out.println("輸入交流電: 220V");
        return 220;
    }
}

創(chuàng)建適配器(Adapter)

public class Adapter implements Target {
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    @Override
    public int out() {
        int output = adaptee.input() / 2;
        System.out.println("輸出交流電: " + output + "V");
        return output;
    }
}

客戶端調(diào)用

    public static void main(String[] args) {
        Target adapter = new Adapter(new Adaptee());
        int result = adapter.out();
        System.out.println(result);
    }

輸入交流電: 220V
輸出交流電: 110V
110

接口適配器

接口適配器的關注點與類適配器和對象適配器的關注點不太一樣,類適配器和對象適配器著重于將系統(tǒng)存在的一個角色(Adaptee)轉(zhuǎn)化成目標接口(Target)所需內(nèi)容,而接口適配器的使用場景是解決接口方法過多,如果直接實現(xiàn)接口,那么類會多出許多空實現(xiàn)的方法,類顯得很臃腫。此時,使用接口適配器就能讓我們只實現(xiàn)我們需要的接口方法,目標更清晰。

接口適配器的主要原理就是原理利用抽象類實現(xiàn)接口,并且空實現(xiàn)接口眾多方法。

創(chuàng)建目標角色(Target)

public interface Target {
    int out1();
    int out2();
    int out3();
    int out4();
}

創(chuàng)建源角色(Adaptee)

public class Adaptee{
    public int input() {
        System.out.println("輸入交流電: 220V");
        return 220;
    }
}

創(chuàng)建適配器(Adapter)

public class Adapter implements Target {
    protected Adaptee adaptee;
    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }
    @Override
    public int out1() {
        int input220V = adaptee.input();
        int output = input220V / 1;
        System.out.println("輸出交流電: " + output + "V");
        return output;
    }
    @Override
    public int out2() {
        int input220V = adaptee.input();
        int output = input220V / 2;
        System.out.println("輸出交流電: " + output + "V");
        return output;
    }
    @Override
    public int out3() {
        return 0;
    }
    @Override
    public int out4() {
        return 0;
    }
}

客戶端調(diào)用

    public static void main(String[] args) {
        Target adapter = new Adapter(new Adaptee());
        adapter.out1();
        System.out.println("---------------------");
        adapter.out2();
        System.out.println("---------------------");
        Target adapter2 = new Adapter(new Adaptee()) {
            @Override
            public int out3() {
                int input220V = adaptee.input();
                int output = input220V / 3;
                System.out.println("輸出交流電: " + output + "V");
                return output;
            }
        };
        adapter2.out3();
        System.out.println("---------------------");
        Target adapter3 = new Adapter(new Adaptee()) {
            @Override
            public int out4() {
                int input220V = adaptee.input();
                int output = input220V / 4;
                System.out.println("輸出交流電: " + output + "V");
                return output;
            }
        };
        adapter3.out4();
    }

輸入交流電: 220V
輸出交流電: 220V
---------------------
輸入交流電: 220V
輸出交流電: 110V
---------------------
輸入交流電: 220V
輸出交流電: 73V
---------------------
輸入交流電: 220V
輸出交流電: 55V

到此這篇關于Java結(jié)構(gòu)型設計模式之適配器模式詳解的文章就介紹到這了,更多相關Java適配器模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析Java中的繼承與組合

    淺析Java中的繼承與組合

    本文將介紹組合和繼承的概念及區(qū)別,并從多方面分析在寫代碼時如何進行選擇。文中通過示例代碼介紹的很詳細,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • 三分鐘教你如何在IDEA中快速創(chuàng)建工程的方法

    三分鐘教你如何在IDEA中快速創(chuàng)建工程的方法

    這篇文章主要介紹了三分鐘教你如何在IDEA中快速創(chuàng)建工程的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • idea 配置checkstyle詳細步驟

    idea 配置checkstyle詳細步驟

    checkstyle是提高代碼質(zhì)量,檢查代碼規(guī)范的很好用的一款工具,本文簡單介紹一下集成的步驟,并提供一份完整的checkstyle的代碼規(guī)范格式文件,以及常見的格式問題的解決方法,需要的朋友可以參考下
    2023-11-11
  • ava實現(xiàn)一致性Hash算法

    ava實現(xiàn)一致性Hash算法

    本文主要詳細介紹了Java如何實現(xiàn)一致性Hash算法,其實現(xiàn)原理將key映射到?2^32?-?1?的空間中,將這個數(shù)字的首尾相連,形成一個環(huán)。想了解更多的同學,可以參考本文
    2023-03-03
  • springboot如何實現(xiàn)前后端分離跨域訪問

    springboot如何實現(xiàn)前后端分離跨域訪問

    這篇文章主要介紹了springboot如何實現(xiàn)前后端分離跨域訪問問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • java圖論普利姆及克魯斯卡算法解決最小生成樹問題詳解

    java圖論普利姆及克魯斯卡算法解決最小生成樹問題詳解

    這篇文章主要為大家介紹了java圖論普利姆算法及克魯斯卡算法解決最小生成樹問題的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Java多線程之鎖學習(增強版)

    Java多線程之鎖學習(增強版)

    這篇文章主要為大家詳細介紹了Java多線程中鎖的相關知識,文中的示例代碼講解詳細,對我們了解線程有一定幫助,需要的可以參考一下
    2023-02-02
  • Java中動態(tài)地改變數(shù)組長度及數(shù)組轉(zhuǎn)Map的代碼實例分享

    Java中動態(tài)地改變數(shù)組長度及數(shù)組轉(zhuǎn)Map的代碼實例分享

    這篇文章主要介紹了Java中動態(tài)地改變數(shù)組長度及數(shù)組轉(zhuǎn)map的代碼分享,其中轉(zhuǎn)Map利用到了java.util.Map接口,需要的朋友可以參考下
    2016-03-03
  • Spring?Boot?3.1中整合Spring?Security和Keycloak的方法

    Spring?Boot?3.1中整合Spring?Security和Keycloak的方法

    本文介紹在最新的SpringBoot3.1版本之下,如何將Keycloak和Spring?Security一起跑起來,文中結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2023-06-06
  • 基于Springboot吞吐量優(yōu)化解決方案

    基于Springboot吞吐量優(yōu)化解決方案

    這篇文章主要介紹了基于Springboot吞吐量優(yōu)化解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論