Java十分鐘精通進(jìn)階適配器模式
1、什么是適配器模式?
其實(shí)適配器這三個(gè)字大家應(yīng)該很熟悉,我們知道蘋果公司的手機(jī)iPhone已經(jīng)不提供充電插頭了,包裝盒內(nèi)只有一根數(shù)據(jù)線,那么我們無(wú)法單獨(dú)使用這根數(shù)據(jù)線進(jìn)行在220V的插板上充電,因此我們需要重新購(gòu)買一個(gè)適配器來(lái)把插板和手機(jī)連接起來(lái),這就是適配器。
其實(shí)在軟件設(shè)計(jì)中也可能出現(xiàn),需要開發(fā)的具有某種業(yè)務(wù)功能的組件在現(xiàn)有的組件庫(kù)中已經(jīng)存在,但它們與當(dāng)前系統(tǒng)的接口規(guī)范不兼容,如果重新開發(fā)這些組件成本又很高,這時(shí)用適配器模式能很好地解決這些問(wèn)題。
2、適配器模式的定義
適配器模式: 將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。
適配器模式分為類結(jié)構(gòu)型模式和對(duì)象結(jié)構(gòu)型模式兩種,前者類之間的耦合度比后者高,且要求程序員了解現(xiàn)有組件庫(kù)中的相關(guān)組件的內(nèi)部結(jié)構(gòu),所以應(yīng)用相對(duì)較少些。
3、適配器模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 客戶端通過(guò)適配器可以透明地調(diào)用目標(biāo)接口
- 復(fù)用了現(xiàn)存的類,程序員不需要修改原有代碼而重用現(xiàn)有的適配者類
- 將目標(biāo)類和適配者類解耦,解決了目標(biāo)類和適配者類接口不一致的問(wèn)題
- 在很多業(yè)務(wù)場(chǎng)景中符合開閉原則
缺點(diǎn):
- 適配器編寫過(guò)程需要結(jié)合業(yè)務(wù)場(chǎng)景全面考慮,可能會(huì)增加系統(tǒng)的復(fù)雜性
- 增加代碼閱讀難度,降低代碼可讀性,過(guò)多使用適配器會(huì)使系統(tǒng)代碼變得凌亂
4、適配器模式的結(jié)構(gòu)與實(shí)現(xiàn)
(以下結(jié)構(gòu)參考自互聯(lián)網(wǎng))
模式的結(jié)構(gòu):
- 目標(biāo)(Target)接口: 當(dāng)前系統(tǒng)業(yè)務(wù)所期待的接口,它可以是抽象類或接口
- 適配者(Adaptee)類: 它是被訪問(wèn)和適配的現(xiàn)存組件庫(kù)中的組件接口
- 適配器(Adapter)類: 它是一個(gè)轉(zhuǎn)換器,通過(guò)繼承或引用適配者的對(duì)象,把適配者接口轉(zhuǎn)換成目標(biāo)接口,讓客戶按目標(biāo)接口的格式訪問(wèn)適配者
類適配器模式的結(jié)構(gòu):
對(duì)象適配器模式的結(jié)構(gòu):
5、適配器模式的代碼實(shí)現(xiàn)
A、使用組合的方式實(shí)現(xiàn)適配器:
我們現(xiàn)在有一臺(tái)筆記本電腦的插頭的三相的,但是我們現(xiàn)在需要使用二相的插頭進(jìn)行充電,所以我們需要給這個(gè)插頭裝上一個(gè)二相的適配器:
三相插座接口:
/** * 三相插座接口 */ public interface ThreePlugIf { //使用三相電流供電 public void powerWithThree(); }
國(guó)標(biāo)的二相插座:
/** * 國(guó)標(biāo)的二相插座 */ public class GBTowPlug { public void powerWithTwo(){ System.out.println("使用二相電流供電"); } }
筆記本:
/** * 筆記本 */ public class NoteBook { private ThreePlugIf plug; public NoteBook(ThreePlugIf plug){ this.plug = plug; } //使用插座充電 public void charge(){ plug.powerWithThree(); } }
三相轉(zhuǎn)二相的插座適配器:
/** * 三相轉(zhuǎn)二相的插座適配器 */ public class TwoPlugAdapter implements ThreePlugIf { private GBTowPlug plug; public TwoPlugAdapter(GBTowPlug plug) { this.plug = plug; } @Override public void powerWithThree() { System.out.println("通過(guò)轉(zhuǎn)換"); plug.powerWithTwo(); } }
測(cè)試類:
public class Test { public static void main(String[] args) { GBTowPlug two = new GBTowPlug(); ThreePlugIf three = new TwoPlugAdapter(two); NoteBook nb = new NoteBook(three); nb.charge(); } }
輸出結(jié)果:
通過(guò)轉(zhuǎn)換
使用二相電流供電
采用組合方式的適配器稱為對(duì)象適配器
特點(diǎn):
把“被適配者”作為一個(gè)對(duì)象組合到適配器類中,以修改目標(biāo)接口包裝給適配者
B、使用繼承的方式實(shí)現(xiàn)適配器:
繼承適配器:
/** * 采用繼承方式的插座適配器 */ public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf{ @Override public void powerWithThree() { System.out.println("借助繼承適配器"); this.powerWithTwo(); } }
測(cè)試類:
public class Test { public static void main(String[] args) { GBTowPlug two = new GBTowPlug(); ThreePlugIf three = new TwoPlugAdapter(two); NoteBook nb = new NoteBook(three); nb.charge(); //使用繼承方法 three = new TwoPlugAdapterExtends(); nb = new NoteBook(three); nb.charge(); } }
輸出:
通過(guò)轉(zhuǎn)換
使用二相電流供電借助繼承適配器
使用二相電流供電
采用繼承方式的稱為類適配器
特點(diǎn):
通過(guò)多重繼承不兼容接口,實(shí)現(xiàn)對(duì)目標(biāo)接口的匹配,單一的為某個(gè)類而實(shí)現(xiàn)適配
6、適配器模式的應(yīng)用場(chǎng)景
- 之前開發(fā)的系統(tǒng)存在滿足新系統(tǒng)功能需求的類,但其接口同新系統(tǒng)的接口不一致
- 使用第三方提供的組件,但組件接口定義和自己要求的接口定義不同
最后,祝大家假期愉快~~~~
到此這篇關(guān)于Java十分鐘精通進(jìn)階適配器模式的文章就介紹到這了,更多相關(guān)Java 適配器模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring-Security對(duì)HTTP相應(yīng)頭的安全支持方式
這篇文章主要介紹了Spring-Security對(duì)HTTP相應(yīng)頭的安全支持方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10解決Request.getParameter獲取不到特殊字符bug問(wèn)題
這篇文章主要介紹了解決Request.getParameter獲取不到特殊字符bug問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Spring?Data?JPA框架的Repository自定義實(shí)現(xiàn)詳解
Spring?Data?JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套?JPA?應(yīng)?框架,可使開發(fā)者?極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和操作,本篇我們來(lái)了解Spring?Data?JPA框架的Repository自定義實(shí)現(xiàn)2022-04-04解決java使用axios.js的post請(qǐng)求后臺(tái)時(shí)無(wú)法接收到入?yún)⒌膯?wèn)題
今天小編就為大家分享一篇解決java使用axios.js的post請(qǐng)求后臺(tái)時(shí)無(wú)法接收到入?yún)⒌膯?wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用示例
本文主要介紹了SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10Java找出兩個(gè)大數(shù)據(jù)量List集合中的不同元素的方法總結(jié)
本文將帶大家了解如何快速的找出兩個(gè)相似度非常高的List集合里的不同元素。主要通過(guò)Java API、List集合雙層遍歷比較不同、借助Map集合查找三種方式,需要的可以參考一下2022-10-10Mybatis + js 實(shí)現(xiàn)下拉列表二級(jí)聯(lián)動(dòng)效果
這篇文章給大家介紹基于Mybatis + js 實(shí)現(xiàn)下拉列表二級(jí)聯(lián)動(dòng)效果,實(shí)現(xiàn)代碼分為前端界面實(shí)現(xiàn)和后端處理方法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-06-06