Java中的適配器模式詳解
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的解決方案
文章講述了在使用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ì)示例代碼
文件上傳中并沒(méi)有什么太多的知識(shí)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)多文件上傳的詳細(xì)示例,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
教你使用eclipse?搭建Swt?環(huán)境的全過(guò)程
本文給大家分享使用eclipse?搭建Swt?環(huán)境的全過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
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ù)源連接和切換的方案
在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ò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09

