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)文章
Spring AOP與代理類(lèi)的執(zhí)行順序級(jí)別淺析
這篇文章主要介紹了Spring AOP與代理類(lèi)的執(zhí)行順序級(jí)別,關(guān)于 Spring AOP和Aspectj的關(guān)系,兩個(gè)都實(shí)現(xiàn)了切面編程,Spring AOP更多地是為了Spring框架本身服務(wù)的,而Aspectj具有更強(qiáng)大、更完善的切面功能2023-03-03Elasticsearch?自動(dòng)重啟腳本創(chuàng)建實(shí)現(xiàn)
這篇文章主要為大家介紹了Elasticsearch?自動(dòng)重啟腳本創(chuàng)建實(shí)現(xiàn)詳解分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08在SpringBoot項(xiàng)目中實(shí)現(xiàn)給所有請(qǐng)求加固定前綴
這篇文章主要介紹了在SpringBoot項(xiàng)目中實(shí)現(xiàn)給所有請(qǐng)求加固定前綴,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的順序表如何操作
程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示2022-03-03SpringCloud HystrixDashboard服務(wù)監(jiān)控詳解
Hystrix Dashboard 是Spring Cloud中查看Hystrix實(shí)例執(zhí)行情況的一種儀表盤(pán)組件,支持查看單個(gè)實(shí)例和查看集群實(shí)例,本文將對(duì)其服務(wù)監(jiān)控學(xué)習(xí)2022-11-11基于SpringBoot + Redis實(shí)現(xiàn)密碼暴力破解防護(hù)
在現(xiàn)代應(yīng)用程序中,保護(hù)用戶(hù)密碼的安全性是至關(guān)重要的,密碼暴力破解是指通過(guò)嘗試多個(gè)密碼組合來(lái)非法獲取用戶(hù)賬戶(hù)的密碼,為了保護(hù)用戶(hù)密碼不被暴力破解,我們可以使用Spring Boot和Redis來(lái)實(shí)現(xiàn)一些防護(hù)措施,本文將介紹如何利用這些技術(shù)來(lái)防止密碼暴力破解攻擊2023-06-06一文帶你掌握J(rèn)ava8中Lambda表達(dá)式 函數(shù)式接口及方法構(gòu)造器數(shù)組的引用
Java 8 (又稱(chēng)為 jdk 1.8) 是 Java 語(yǔ)言開(kāi)發(fā)的一個(gè)主要版本。 Oracle 公司于 2014 年 3 月 18 日發(fā)布 Java 8 ,它支持函數(shù)式編程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等2021-10-10Java8接口默認(rèn)靜態(tài)方法及重復(fù)注解原理解析
這篇文章主要介紹了Java8接口默認(rèn)靜態(tài)方法及重復(fù)注解原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04