最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的適配器模式詳解

 更新時(shí)間:2023年09月14日 09:33:01   作者:萬(wàn)里顧—程  
這篇文章主要介紹了Java中的適配器模式詳解,適配器模式(Adapter?Pattern)將某個(gè)類(lèi)的接口轉(zhuǎn)換成客戶端期望的另一個(gè)接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個(gè)類(lèi)可以協(xié)同工作,需要的朋友可以參考下

1、適配器模式概述

在軟件設(shè)計(jì)中可能出現(xiàn):需要開(kāi)發(fā)的具有某種業(yè)務(wù)功能的組件在現(xiàn)有的組件庫(kù)中已經(jīng)存在,但它們與當(dāng)前系統(tǒng)的接口規(guī)范不兼容,如果重新開(kāi)發(fā)這些組件成本又很高,這時(shí)用適配器模式能很好地解決這些問(wèn)題。

適配器模式介紹

適配器模式(Adapter Pattern)將某個(gè)類(lèi)的接口轉(zhuǎn)換成客戶端期望的另一個(gè)接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個(gè)類(lèi)可以協(xié)同工作。其別名為包裝器(Wrapper)。

適配器模式屬于結(jié)構(gòu)型模式。

主要分為三類(lèi):類(lèi)適配器模式、對(duì)象適配器模式、接口適配器模式。

適配器工作原理

1、適配器模式:將一個(gè)類(lèi)的接口轉(zhuǎn)換成另一種接口.讓原本接口不兼容的類(lèi)可以兼容

2、從用戶的角度看不到被適配者,是解耦的

3、用戶調(diào)用適配器轉(zhuǎn)化出來(lái)的目標(biāo)接口方法,適配器再調(diào)用被適配者的相關(guān)接口方法

4、用戶收到反饋結(jié)果,感覺(jué)只是和目標(biāo)接口交互,如圖

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

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

  • 客戶端通過(guò)適配器可以透明地調(diào)用目標(biāo)接口。
  • 復(fù)用了現(xiàn)存的類(lèi),程序員不需要修改原有代碼而重用現(xiàn)有的適配者類(lèi)。
  • 將目標(biāo)類(lèi)和適配者類(lèi)解耦,解決了目標(biāo)類(lèi)和適配者類(lèi)接口不一致的問(wèn)題。
  • 在很多業(yè)務(wù)場(chǎng)景中符合開(kāi)閉原則。

缺點(diǎn):

  • 適配器編寫(xiě)過(guò)程需要結(jié)合業(yè)務(wù)場(chǎng)景全面考慮,可能會(huì)增加系統(tǒng)的復(fù)雜性。
  • 增加代碼閱讀難度,降低代碼可讀性,過(guò)多使用適配器會(huì)使系統(tǒng)代碼變得凌亂。

2、適配器模式的結(jié)構(gòu)圖

適配器模式的結(jié)構(gòu)

適配器模式(Adapter)包含以下主要角色。

  • 目標(biāo)(Target)接口:當(dāng)前系統(tǒng)業(yè)務(wù)所期待的接口,它可以是抽象類(lèi)或接口。
  • 適配者(Adaptee)類(lèi):它是被訪問(wèn)和適配的現(xiàn)存組件庫(kù)中的組件接口。
  • 適配器(Adapter)類(lèi):它是一個(gè)轉(zhuǎn)換器,通過(guò)繼承或引用適配者的對(duì)象,把適配者接口轉(zhuǎn)換成目標(biāo)接口,讓客戶按目標(biāo)接口的格式訪問(wèn)適配者。

適配器模式的結(jié)構(gòu)圖

類(lèi)適配器模式:

對(duì)象適配器模式:

3、類(lèi)適配器模式的實(shí)現(xiàn)

類(lèi)適配器模式介紹

適配器通過(guò)繼承適配者類(lèi),實(shí)現(xiàn)目標(biāo)接口,完成適配者 ----》目標(biāo)接口的轉(zhuǎn)換。

類(lèi)適配器模式的實(shí)現(xiàn)

編寫(xiě)適配者類(lèi):

public class Voltage220V {
    //輸出220V的電壓
    public int output220V(){
        int src = 220;
        System.out.println("電壓為"+src+"伏");
        return src;
    }
}

編寫(xiě)目標(biāo)接口:當(dāng)前系統(tǒng)業(yè)務(wù)所期待的接口

public interface IVoltage5V {
    public int output5V();
}

編寫(xiě)適配器:繼承適配者類(lèi),實(shí)現(xiàn)目標(biāo)接口

public class VoltageAdapter extends Voltage220V implements IVoltage5V{
    @Override
    public int output5V() {
        //調(diào)用Voltage220V里的方法得到220V
        int srcV = output220V();
        //把220V轉(zhuǎn)換成5V并輸出
        int dstV =srcV / 44 ;
        return dstV;
    }
}

編寫(xiě)業(yè)務(wù):

public class Phone {
    public void charging(IVoltage5V iVoltage5V){
        if (iVoltage5V.output5V() == 5){
            System.out.println("適配后的電壓5V,可以充電");
        }else {
            System.out.println("適配后的電壓異常,不能充電");
        }
    }
}

編寫(xiě)測(cè)試類(lèi):

public class client {
    public static void main(String[] args) {
        System.out.println("測(cè)試類(lèi)適配器模式:");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter());
    }
}

類(lèi)適配器模式注意事項(xiàng)

1、Java是單繼承機(jī)制,所以類(lèi)適配器需要繼承適配者類(lèi)這一點(diǎn)算是一個(gè)缺點(diǎn),因?yàn)檫@要求目標(biāo)必須是接口,有一定局限性;

2、適配者類(lèi)的方法在Adapter(適配器)中都會(huì)暴露出來(lái),也增加了使用的成本。

3、由于其繼承了適配者類(lèi),所以它可以根據(jù)需求重寫(xiě)適配者類(lèi)的方法,使得Adapter(適配器)的靈活性增強(qiáng)了。

4、對(duì)象適配器模式的實(shí)現(xiàn)

對(duì)象適配器模式的介紹

1、基本思路和類(lèi)的適配器模式相同,只是將Adapter類(lèi)作修改,不是繼承適配者類(lèi),而是持有適配者類(lèi)的實(shí)例,以解決兼容性的問(wèn)題。即:持有適配者類(lèi),實(shí)現(xiàn)目標(biāo)接口,完成適配者->目標(biāo)接口的適配

2、根據(jù)“合成復(fù)用原則”,在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系來(lái)替代繼承關(guān)系。

3、對(duì)象適配器模式是適配器模式常用的一種

對(duì)象適配器模式的實(shí)現(xiàn)

編寫(xiě)適配者類(lèi):

public class Voltage220V {
    //輸出220V的電壓
    public int output220V(){
        int src = 220;
        System.out.println("電壓為"+src+"伏");
        return src;
    }
}

編寫(xiě)目標(biāo)接口:當(dāng)前系統(tǒng)業(yè)務(wù)所期待的接口

public interface IVoltage5V {
    public int output5V();
}

編寫(xiě)適配器:持有適配者類(lèi),實(shí)現(xiàn)目標(biāo)接口

public class VoltageAdapter implements IVoltage5V {
    private Voltage220V voltage220V;
    //傳入適配者類(lèi)實(shí)例
    public VoltageAdapter(Voltage220V voltage220V){
        this.voltage220V = voltage220V;
    }
    @Override
    public int output5V() {
        int dst = 0;
        //調(diào)用Voltage220V里的方法得到220V
        if (null != voltage220V){
            int srcV = voltage220V.output220V();
            dst = srcV / 44;
        }
        return dst;
    }
}

編寫(xiě)業(yè)務(wù):

public class Phone {
    public void charging(IVoltage5V iVoltage5V){
        if (iVoltage5V.output5V() == 5){
            System.out.println("適配后的電壓5V,可以充電");
        }else {
            System.out.println("適配后的電壓異常,不能充電");
        }
    }
}

編寫(xiě)測(cè)試類(lèi):

public class client {
    public static void main(String[] args) {
        System.out.println("對(duì)象適配器模式:");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));
    }
}

對(duì)象適配器模式注意事項(xiàng)

1、對(duì)象適配器和類(lèi)適配器其實(shí)算是同一種思想,只不過(guò)實(shí)現(xiàn)方式不同。

根據(jù)合成復(fù)用原則,使用組合替代繼承,所以它解決了類(lèi)適配器必須繼承適配者的局限性問(wèn)題,也不再要求目標(biāo)必須是接口。

2、使用成本更低,更靈活。

5、接口適配器的實(shí)現(xiàn)

接口適配器的介紹

1、一些書(shū)籍稱(chēng)為:適配器模式(Default Adapter Pattern)或缺省適配器模式。

2、當(dāng)不需要全部實(shí)現(xiàn)接口提供的方法時(shí),這時(shí)我們可以使用一個(gè)抽象類(lèi)作為中間件,即適配器,用這個(gè)抽象類(lèi)實(shí)現(xiàn)接口,而在抽象類(lèi)中所有的方法都進(jìn)行置空,那么我們?cè)賱?chuàng)建抽象類(lèi)的繼承類(lèi),而且重寫(xiě)我們需要使用的那幾個(gè)方法即可。

3、接口適配器適用于一個(gè)接口不想使用其所有的方法的情況。

接口適配器模式的實(shí)現(xiàn)

適配者作為接口:

public interface Interface4 {
    void m1();
    void m2();
    void m3();
    void m4();
}

接口適配器:

public abstract class AbsAdapter implements Interface4{
    @Override
    public void m1() {
    }
    @Override
    public void m2() {
    }
    @Override
    public void m3() {
    }
    @Override
    public void m4() {
    }
}

測(cè)試類(lèi):

public class Client extends AbsAdapter{
    public static void main(String[] args) {
        Client client = new Client();
        client.m2();
    }
    @Override
    public void m2() {
        System.out.println("使用了m2方法");
    }
}

到此這篇關(guān)于Java中的適配器模式詳解的文章就介紹到這了,更多相關(guān)Java適配器模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Jenkins打包Maven項(xiàng)目找不到mvn:not found的解決方案

    Jenkins打包Maven項(xiàng)目找不到mvn:not found的解決方案

    文章講述了在使用Docker重新部署Jenkins并使用流水線腳本打包項(xiàng)目時(shí)遇到的編譯找不到mvn命令的問(wèn)題,通過(guò)檢查Jenkins服務(wù)器上的Maven安裝、Maven插件、全局工具配置以及系統(tǒng)環(huán)境變量,最終解決了問(wèn)題
    2025-11-11
  • SpringBoot實(shí)現(xiàn)多文件上傳的詳細(xì)示例代碼

    SpringBoot實(shí)現(xiàn)多文件上傳的詳細(xì)示例代碼

    文件上傳中并沒(méi)有什么太多的知識(shí)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)多文件上傳的詳細(xì)示例,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • MyBatis框架簡(jiǎn)介及入門(mén)案例詳解

    MyBatis框架簡(jiǎn)介及入門(mén)案例詳解

    MyBatis是一個(gè)優(yōu)秀的持久層框架,它對(duì)jdbc的操作數(shù)據(jù)庫(kù)的過(guò)程進(jìn)行封裝,使開(kāi)發(fā)者只需要關(guān)注SQL本身,而不需要花費(fèi)精力去處理例如注冊(cè)驅(qū)動(dòng)、創(chuàng)建connection、創(chuàng)建statement、手動(dòng)設(shè)置參數(shù)、結(jié)果集檢索等jdbc繁雜的過(guò)程代碼,本文將作為最終篇為大家介紹MyBatis的使用
    2022-08-08
  • 淺析對(duì)Spring?aware接口理解

    淺析對(duì)Spring?aware接口理解

    通過(guò)aware接口可以獲取Spring容器相關(guān)信息,但這樣會(huì)與Spring容器耦合,這篇文章主要介紹了Spring?aware接口理解,需要的朋友可以參考下
    2022-08-08
  • 教你使用eclipse?搭建Swt?環(huán)境的全過(guò)程

    教你使用eclipse?搭建Swt?環(huán)境的全過(guò)程

    本文給大家分享使用eclipse?搭建Swt?環(huán)境的全過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 基于spring boot 的配置參考大全(推薦)

    基于spring boot 的配置參考大全(推薦)

    下面小編就為大家?guī)?lái)一篇基于spring boot 的配置參考大全(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Java中Lambda表達(dá)式的使用詳細(xì)教程

    Java中Lambda表達(dá)式的使用詳細(xì)教程

    這篇文章將通過(guò)示例為大家詳細(xì)展示Java中Lambda表達(dá)式的用法,同時(shí)也會(huì)介紹Lambda的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • idea中java報(bào)錯(cuò):java:-source1.5中不支持diamond運(yùn)算符的問(wèn)題及解決

    idea中java報(bào)錯(cuò):java:-source1.5中不支持diamond運(yùn)算符的問(wèn)題及解決

    文章介紹了在IDEA中導(dǎo)入現(xiàn)有項(xiàng)目時(shí)遇到的編譯錯(cuò)誤,原因是項(xiàng)目設(shè)置的Language?level為1.5,不支持diamond運(yùn)算符,解決方法是將Language?level改為7或更高版本,具體操作步驟在文章中詳細(xì)說(shuō)明
    2026-03-03
  • SpringBoot中實(shí)現(xiàn)多數(shù)據(jù)源連接和切換的方案

    SpringBoot中實(shí)現(xiàn)多數(shù)據(jù)源連接和切換的方案

    在Spring Boot中,通過(guò)AbstractRoutingDataSource實(shí)現(xiàn)多數(shù)據(jù)源連接是一種常見(jiàn)的做法,這種技術(shù)允許你在運(yùn)行時(shí)動(dòng)態(tài)地切換數(shù)據(jù)源,從而支持對(duì)多個(gè)數(shù)據(jù)庫(kù)的操作,本文給大家介紹了SpringBoot中實(shí)現(xiàn)多數(shù)據(jù)源連接和切換的方案,需要的朋友可以參考下
    2024-11-11
  • Java字符串無(wú)意識(shí)的遞歸過(guò)程解析

    Java字符串無(wú)意識(shí)的遞歸過(guò)程解析

    這篇文章主要介紹了Java字符串無(wú)意識(shí)的遞歸過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

东安县| 吉林市| 三亚市| 五寨县| 庆元县| 康马县| 四平市| 闽清县| 黄山市| 沁阳市| 天门市| 晴隆县| 福海县| 米脂县| 兴隆县| 鄂温| 呼玛县| 馆陶县| 南召县| 淅川县| 双辽市| 田东县| 虞城县| 平乡县| 平塘县| 嘉义市| 民丰县| 札达县| 老河口市| 万年县| 达日县| 县级市| 奇台县| 常山县| 锦屏县| 江城| 西乌珠穆沁旗| 孝昌县| 金华市| 元阳县| 来凤县|