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


四.實(shí)例分析
去年買了一個本本,另外給本本配了羅技G1光電套??拥氖?,光電套的鼠標(biāo)是USB接口,鍵盤是PS2接口,可我的本本卻沒有PS2接口啊。于是跑到市場,淘了一個轉(zhuǎn)接器。
于是乎,我抽象了這么幾個類。

1.PS2Port(PS2接口)。
2.USBPort(USB接口)。
3.PS2ToUSB(對象適配器),將PS2接口裝換成USB接口。
4.TestAdapter(測試類),客戶端。
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;
/**
* 對象適配器
* 將PS2接口裝換成USB接口
* 所以此類類型是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)鍵在這里,本來是");
ps2Port.workWithPS2();
System.out.println("經(jīng)過你的轉(zhuǎn)換,現(xiàn)在是USB工作中");
}
}
TestAdapter
package com.bjpowernode.adapter;
/**
* 測試類
* client
* @author eason
*
*/
public class TestAdapter {
public static void main(String[] args) {
//我現(xiàn)在有一個PS2接口
PS2Port ps2Port = new PS2Port() {
@Override
public void workWithPS2() {
System.out.println("PS2工作中");
}
};
//但是我需要的是一個USB接口啊,對我(client)來說,我只認(rèn)識USB接口
//經(jīng)過PS2ToUSB的轉(zhuǎn)換,PS2接口變成了USB接口
USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port);
ps2ToUsbPort.workWithUSB();
}
}
五.對象的適配器和類的適配器
上述的適配器就是對象適配器。再看看類適配器。

PS2ToUSB,只是簡單模擬一下。因?yàn)閖ava不允許多繼承,所以java中沒有類模式的代碼,只有思想。
package com.bjpowernode.adapter;
/**
* 類適配器
* @author eason
*
*/
public class PS2ToUSB implements USBPort, PS2Port{
//重寫workWithUSB,把工作交給workWithPS2
@Override
public void workWithUSB() {
workWithPS2();
}
}
差別就是:對象適配器實(shí)現(xiàn)了客戶端想要的接口(USB),在內(nèi)部有一個被適配對象(PS2)的引用,通過組合實(shí)現(xiàn)適配功能。類適配器實(shí)現(xiàn)了客戶端想要的接口(USB)和被適配對象接口(PS2),通過繼承來實(shí)現(xiàn)適配功能。
六.使用場景及使用感受
1.希望復(fù)用一些現(xiàn)存的類,但是接口又與復(fù)用環(huán)境要求不一致。
2.其實(shí)適配器模式有點(diǎn)無奈之舉,在前期設(shè)計的時候,我們就不應(yīng)該考慮適配器模式,而應(yīng)該考慮通過重構(gòu)統(tǒng)一接口。
七.適配器模式與裝飾者模式
它們都可以用來包裝對象,本質(zhì)區(qū)別在于
1.適配器模式:將一個接口轉(zhuǎn)換成另外一個接口。
2.裝飾者模式:不改變接口,只加入職責(zé)。
相關(guān)文章
Elasticsearch?自動重啟腳本創(chuàng)建實(shí)現(xiàn)
這篇文章主要為大家介紹了Elasticsearch?自動重啟腳本創(chuàng)建實(shí)現(xiàn)詳解分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
在SpringBoot項(xiàng)目中實(shí)現(xiàn)給所有請求加固定前綴
這篇文章主要介紹了在SpringBoot項(xiàng)目中實(shí)現(xiàn)給所有請求加固定前綴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的順序表如何操作
程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關(guān)系由它們的存儲順序自然表示2022-03-03
SpringCloud HystrixDashboard服務(wù)監(jiān)控詳解
Hystrix Dashboard 是Spring Cloud中查看Hystrix實(shí)例執(zhí)行情況的一種儀表盤組件,支持查看單個實(shí)例和查看集群實(shí)例,本文將對其服務(wù)監(jiān)控學(xué)習(xí)2022-11-11
基于SpringBoot + Redis實(shí)現(xiàn)密碼暴力破解防護(hù)
在現(xiàn)代應(yīng)用程序中,保護(hù)用戶密碼的安全性是至關(guān)重要的,密碼暴力破解是指通過嘗試多個密碼組合來非法獲取用戶賬戶的密碼,為了保護(hù)用戶密碼不被暴力破解,我們可以使用Spring Boot和Redis來實(shí)現(xiàn)一些防護(hù)措施,本文將介紹如何利用這些技術(shù)來防止密碼暴力破解攻擊2023-06-06
一文帶你掌握J(rèn)ava8中Lambda表達(dá)式 函數(shù)式接口及方法構(gòu)造器數(shù)組的引用
Java 8 (又稱為 jdk 1.8) 是 Java 語言開發(fā)的一個主要版本。 Oracle 公司于 2014 年 3 月 18 日發(fā)布 Java 8 ,它支持函數(shù)式編程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等2021-10-10
Java8接口默認(rèn)靜態(tài)方法及重復(fù)注解原理解析
這篇文章主要介紹了Java8接口默認(rèn)靜態(tài)方法及重復(fù)注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04

