Java適配器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
一.概念
適配器模式將一個(gè)接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。它使得原來(lái)由于接口不兼容而不能在一起工作的那些類(lèi)可以一起工作。
二.UML
三.更加生動(dòng)的例子


四.實(shí)例分析
去年買(mǎi)了一個(gè)本本,另外給本本配了羅技G1光電套??拥氖牵怆娞椎氖髽?biāo)是USB接口,鍵盤(pán)是PS2接口,可我的本本卻沒(méi)有PS2接口啊。于是跑到市場(chǎng),淘了一個(gè)轉(zhuǎn)接器。
于是乎,我抽象了這么幾個(gè)類(lèi)。

1.PS2Port(PS2接口)。
2.USBPort(USB接口)。
3.PS2ToUSB(對(duì)象適配器),將PS2接口裝換成USB接口。
4.TestAdapter(測(cè)試類(lèi)),客戶(hù)端。
PS2Port
package com.bjpowernode.adapter;
/**
* PS2接口,圓口
* @author eason
*
*/
public interface PS2Port {
public void workWithPS2();
}
USBPort
package com.bjpowernode.adapter;
/**
* USB接口,U口
* @author eason
*
*/
public interface USBPort {
public void workWithUSB();
}
PS2ToUSB
package com.bjpowernode.adapter;
/**
* 對(duì)象適配器
* 將PS2接口裝換成USB接口
* 所以此類(lèi)類(lèi)型是USB接口(implements USBPort) + 成員變量ps2Port
* @author eason
*
*/
public class PS2ToUSB implements USBPort{
private PS2Port ps2Port;
public PS2ToUSB(PS2Port ps2Port) {
this.ps2Port = ps2Port;
}
@Override
public void workWithUSB() {
System.out.println("轉(zhuǎn)換的關(guān)鍵在這里,本來(lái)是");
ps2Port.workWithPS2();
System.out.println("經(jīng)過(guò)你的轉(zhuǎn)換,現(xiàn)在是USB工作中");
}
}
TestAdapter
package com.bjpowernode.adapter;
/**
* 測(cè)試類(lèi)
* client
* @author eason
*
*/
public class TestAdapter {
public static void main(String[] args) {
//我現(xiàn)在有一個(gè)PS2接口
PS2Port ps2Port = new PS2Port() {
@Override
public void workWithPS2() {
System.out.println("PS2工作中");
}
};
//但是我需要的是一個(gè)USB接口啊,對(duì)我(client)來(lái)說(shuō),我只認(rèn)識(shí)USB接口
//經(jīng)過(guò)PS2ToUSB的轉(zhuǎn)換,PS2接口變成了USB接口
USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port);
ps2ToUsbPort.workWithUSB();
}
}
五.對(duì)象的適配器和類(lèi)的適配器
上述的適配器就是對(duì)象適配器。再看看類(lèi)適配器。

PS2ToUSB,只是簡(jiǎn)單模擬一下。因?yàn)閖ava不允許多繼承,所以java中沒(méi)有類(lèi)模式的代碼,只有思想。
package com.bjpowernode.adapter;
/**
* 類(lèi)適配器
* @author eason
*
*/
public class PS2ToUSB implements USBPort, PS2Port{
//重寫(xiě)workWithUSB,把工作交給workWithPS2
@Override
public void workWithUSB() {
workWithPS2();
}
}
差別就是:對(duì)象適配器實(shí)現(xiàn)了客戶(hù)端想要的接口(USB),在內(nèi)部有一個(gè)被適配對(duì)象(PS2)的引用,通過(guò)組合實(shí)現(xiàn)適配功能。類(lèi)適配器實(shí)現(xiàn)了客戶(hù)端想要的接口(USB)和被適配對(duì)象接口(PS2),通過(guò)繼承來(lái)實(shí)現(xiàn)適配功能。
六.使用場(chǎng)景及使用感受
1.希望復(fù)用一些現(xiàn)存的類(lèi),但是接口又與復(fù)用環(huán)境要求不一致。
2.其實(shí)適配器模式有點(diǎn)無(wú)奈之舉,在前期設(shè)計(jì)的時(shí)候,我們就不應(yīng)該考慮適配器模式,而應(yīng)該考慮通過(guò)重構(gòu)統(tǒng)一接口。
七.適配器模式與裝飾者模式
它們都可以用來(lái)包裝對(duì)象,本質(zhì)區(qū)別在于
1.適配器模式:將一個(gè)接口轉(zhuǎn)換成另外一個(gè)接口。
2.裝飾者模式:不改變接口,只加入職責(zé)。
相關(guān)文章
SpringBoot定制JSON響應(yīng)數(shù)據(jù)返回的示例代碼
@JsonView 是 Jackson 庫(kù)中的一個(gè)注解,它允許你定義哪些屬性應(yīng)該被序列化到 JSON 中,基于不同的“視圖”或“配置”,在本文中,通過(guò)了解@JsonView,你將能夠更好地掌握如何在Spring Boot應(yīng)用中定制JSON數(shù)據(jù)的輸出,需要的朋友可以參考下2024-05-05
在idea中創(chuàng)建SpringBoot項(xiàng)目
這篇文章主要介紹了在idea中創(chuàng)建SpringBoot項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Java springboot壓縮文件上傳,解壓,刪除壓縮包方式
這篇文章主要介紹了Java springboot壓縮文件上傳,解壓,刪除壓縮包方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Spring Boot如何使用httpcomponents實(shí)現(xiàn)http請(qǐng)求
這篇文章主要介紹了Spring Boot使用httpcomponents實(shí)現(xiàn)http請(qǐng)求的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
基于springboot?配置文件context-path的坑
這篇文章主要介紹了基于springboot?配置文件context-path的坑,基于很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java中StringBuffer和StringBuilder_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
StringBuffer、StringBuilder和String一樣,也用來(lái)代表字符串。String類(lèi)是不可變類(lèi),StringBuffer則是可變類(lèi),任何對(duì)它所指代的字符串的改變都不會(huì)產(chǎn)生新的對(duì)象。本文重點(diǎn)給大家介紹String、StringBuffer、StringBuilder區(qū)別,感興趣的朋友一起看看吧2017-04-04
springmvc整合freemarker配置的詳細(xì)步驟
本篇文章主要介紹了springmvc整合freemarker的詳細(xì)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
java理論基礎(chǔ)Stream API終端操作示例解析
這篇文章主要為大家介紹了java理論基礎(chǔ)Stream API終端操作示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
微信APP支付(IOS手機(jī)端+java后臺(tái))版
這篇文章主要為大家詳細(xì)介紹了微信APP支付(IOS手機(jī)端+java后臺(tái))版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05

