java設(shè)計模式之淺談適配器模式
一、結(jié)構(gòu)型模式
結(jié)構(gòu)型模式有什么好處?
從程序的結(jié)構(gòu)上實現(xiàn)松耦合,從而可以擴(kuò)大整體的類結(jié)構(gòu),用來解決更大的問題
二、適配器模式
USB網(wǎng)線轉(zhuǎn)換器
三、什么是適配器模式?
將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。Adapter模式使得原本接口不兼容而不能一起工作的那些類能夠變得在一起工作!
四、角色分析
目標(biāo)接口:客戶所期待的接口,目標(biāo)可以是具體的或抽象的類,也可以是接口
需要適配的類:需要適配的類或適配者類
適配器:通過包裝一個需要適配的對象,把原接口轉(zhuǎn)換成目標(biāo)對象!
例子:
適配的類:網(wǎng)線
package com.jialidun.gof.adapter; //要被適配的類:網(wǎng)線 public class Adaptee { public void request(){ System.out.println("連接網(wǎng)線上網(wǎng)!"); } }
接口轉(zhuǎn)換器的抽象方法
package com.jialidun.gof.adapter; //接口轉(zhuǎn)換器的抽象實現(xiàn) public interface NetToUsb { //作用:處理請求 網(wǎng)線插到USB上 public void hanleRequest(); }
真正的適配器,需要連接USB,連接網(wǎng)線
package com.jialidun.gof.adapter; //真正的適配器,需要連接USB,連接網(wǎng)線 //方式1 繼承(類適配器、單繼承) public class Adapter extends Adaptee implements NetToUsb{ @Override public void hanleRequest() { super.request();//可以上網(wǎng)了 } }
創(chuàng)建客戶端,需要上網(wǎng),網(wǎng)線不匹配
package com.jialidun.gof.adapter; //客戶端類:想上網(wǎng),插不上網(wǎng)線 public class Computer { //我們的電腦需要連接上轉(zhuǎn)接器才可以上網(wǎng) public void net(NetToUsb adapter){ //上網(wǎng)的具體實現(xiàn),找一個轉(zhuǎn)接頭 adapter.hanleRequest(); } public static void main(String[] args) { //電腦 適配器 網(wǎng)線 Computer computer = new Computer();//電腦 Adaptee adaptee = new Adaptee();//網(wǎng)線 Adapter adapter = new Adapter();//轉(zhuǎn)接器 computer.net(adapter); } }
上面的例子有局限性,盡量不使用繼承,修改方法
修改適配器
package com.jialidun.gof.adapter; //方式2 組合(對象適配器、常用) public class Adaapter2 implements NetToUsb{ private Adaptee adaptee; public Adaapter2(Adaptee adaptee){ this.adaptee = adaptee; } @Override public void hanleRequest() { adaptee.request(); } }
客戶端
package com.jialidun.gof.adapter; //客戶端類:想上網(wǎng),插不上網(wǎng)線 public class Computer { //我們的電腦需要連接上轉(zhuǎn)接器才可以上網(wǎng) public void net(NetToUsb adapter){ //上網(wǎng)的具體實現(xiàn),找一個轉(zhuǎn)接頭 adapter.hanleRequest(); } public static void main(String[] args) { //電腦 適配器 網(wǎng)線 // Computer computer = new Computer();//電腦 // Adaptee adaptee = new Adaptee();//網(wǎng)線 // Adapter adapter = new Adapter();//轉(zhuǎn)接器 // // computer.net(adapter); Computer computer = new Computer();//電腦 Adaptee adaptee = new Adaptee();//網(wǎng)線 Adaapter2 adaapter2 = new Adaapter2(adaptee); adaapter2.hanleRequest(); } }
五、對象適配器有哪些優(yōu)點
1.一個對象適配器可以把多個不同的適配者適配到同一個目標(biāo)。
2.可以適配一個適配者的子類,由于適配器和適配者之間是關(guān)聯(lián)關(guān)系,根據(jù)"里氏替換原則",適配者的子類也可通過該適配器進(jìn)行適配。
六、類適配器缺點
對于Java、C#等不支持多重類繼承的語言,一次最多只能適配一個適配者類,不能同時適配多個適配者;
在Java、C#等語言中,類適配器模式中的目標(biāo)抽象類只能為接口,不能為類,其使用有一定的局限性。
七、使用場景
系統(tǒng)需要使用一些現(xiàn)有的類,而這些類的接口(如方法名)不符合系統(tǒng)的需求,甚至沒有這些類的源代碼。
想創(chuàng)建一個重復(fù)使用的類,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來引進(jìn)的類一起工作。
例如SpringMVC中DispacherServlet、HandlerAdpter等
到此這篇關(guān)于java設(shè)計模式之淺談適配器模式的文章就介紹到這了,更多相關(guān)java適配器模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring mvc服務(wù)端數(shù)據(jù)校驗實現(xiàn)流程詳解
這篇文章主要介紹了Spring mvc服務(wù)端數(shù)據(jù)校驗實現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09如何在spring事務(wù)提交之后進(jìn)行異步操作
這篇文章主要為大家介紹了如何在spring事務(wù)提交之后進(jìn)行異步操作,這些異步操作必須得在該事務(wù)成功提交后才執(zhí)行,回滾則不執(zhí)行,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2023-09-09劍指Offer之Java算法習(xí)題精講二叉樹的構(gòu)造和遍歷
跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化2022-03-03如何基于java隨機(jī)獲取不重復(fù)數(shù)值
這篇文章主要介紹了如何基于java隨機(jī)獲取不重復(fù)數(shù)值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09