摘要:二適配器模式概念適配器模式是一種結(jié)構(gòu)型模式,它的思想是將一個接口轉(zhuǎn)化為另一個接口。適配器模式包含四個角色對象定義所需要的方法請求者負責(zé)使用對象定義的方法來做具體的處理被適配者以持有方法的角色適配器使用被適配者的方法來滿足對象的需要。
一、結(jié)構(gòu)型設(shè)計模式
1、概念
結(jié)構(gòu)型設(shè)計模式描述如何將類或者對象結(jié)合在一起形成更為復(fù)雜,功能更為強大的結(jié)構(gòu)。
2、分類
(1)類結(jié)構(gòu)模型:這種結(jié)構(gòu)模型關(guān)心類的組合,類直接組合成一個更大的系統(tǒng),通常用繼承來建立這種關(guān)系。
(2)對象結(jié)構(gòu)模型:這種模型結(jié)構(gòu)關(guān)心類與對象的組合,通常在一個類中使用另一個類的對象,再調(diào)用其方法。
注:“合成復(fù)用原則”規(guī)定盡量用關(guān)聯(lián)關(guān)系來代替繼承關(guān)系,因此一般使用對象結(jié)構(gòu)模型。
二、適配器模式1、概念
適配器模式是一種結(jié)構(gòu)型模式,它的思想是將一個接口轉(zhuǎn)化為另一個接口。
適配器模式包含四個角色:
(1)對象:定義所需要的方法
(2)請求者:負責(zé)使用對象定義的方法來做具體的處理
(3)被適配者:以持有方法的角色
(4)適配器:使用被適配者的方法來滿足對象的需要。
2、代碼示例:使用安卓充電器給蘋果充電
(1)安卓和蘋果充電器接口
//安卓 public interface MicroUsbInterface { public void chargeWithMicroUsb(); } //蘋果 public interface LightningInterface { public void chargeWithLightning(); }
(2)安卓設(shè)備充電器
public class AndroidCharger implements MicroUsbInterface { @Override public void chargeWithMicroUsb() { System.out.println("使用MicroUsb型號的充電器充電..."); } }
(3)適配器(用安卓充電器適配蘋果充電器)
public class Adapter implements LightningInterface { //將安卓充電器的接口作為一個字段 private MicroUsbInterface microUsbInterface; public Adapter() { } public Adapter(MicroUsbInterface microUsbInterface) { this.microUsbInterface = microUsbInterface; } @Override public void chargeWithLightning() { //使用安卓充電器給蘋果設(shè)備充電 microUsbInterface.chargeWithMicroUsb(); } public MicroUsbInterface getMicroUsbInterface() { return microUsbInterface; } public void setMicroUsbInterface(MicroUsbInterface microUsbInterface) { this.microUsbInterface = microUsbInterface; } }
在這個示例中,對象就是給蘋果手機充電,請求者就是蘋果手機,被適配者是安卓充電器,適配器是用安卓充電器給蘋果手機充電的適配器。
3、適用場景
(1)系統(tǒng)想要使用現(xiàn)有類,但這個類的接口不符合系統(tǒng)需要
(2)想要建立一個可以重復(fù)使用的類,用在一些沒有關(guān)聯(lián)的類之間
(3)通過接口轉(zhuǎn)換將一個類插到另一個類系當(dāng)中。(比如新增一個飛狗類,就可以實現(xiàn)飛的接口,并且增加一個狗字段)
4、優(yōu)缺點
(1)優(yōu)點:將目標(biāo)和被適配者解耦,通過適配器來關(guān)聯(lián),同時具有透明性、復(fù)用性、靈活性和擴展性。
(2)缺點:過度的使用適配器會讓系統(tǒng)顯得比較凌亂。
三、適配器應(yīng)用1、SpringMVC的HandleAdapter使用了適配器模式的思想
SpringMVC中的handler(Controller,HttpRequestHandler,Servlet)的實現(xiàn)方式是多重的,可以是繼承controller的,也可能是注解控制器方式的。
因此如果是正常的調(diào)用,需要通過if else語句去判斷,這樣就會破壞開閉原則。
為了解決這個問題,Spring定義了一個適配接口,使得每一個handler都有一種對應(yīng)的適配器實現(xiàn)類, 讓適配器代替handler執(zhí)行相應(yīng)的方法。這樣在擴展Controller 時,只需要增加一個適配器類就完成了SpringMVC的擴展了。
//定義一個Adapter接口 public interface HandlerAdapter { public boolean supports(Object handler); public void handle(Object handler); } 這是一段模擬的代碼 //以下是三種Controller實現(xiàn) public interface Controller { } //HTTP請求處理器 public class HttpController implements Controller{ public void doHttpHandler(){ System.out.println("http..."); } } //繼承Controller方式 public class SimpleController implements Controller{ public void doSimplerHandler(){ System.out.println("simple..."); } } //注解方式 public class AnnotationController implements Controller{ public void doAnnotationHandler(){ System.out.println("annotation..."); } } //下面編寫適配器類 public class SimpleHandlerAdapter implements HandlerAdapter { public void handle(Object handler) { ((SimpleController)handler).doSimplerHandler(); } public boolean supports(Object handler) { return (handler instanceof SimpleController); } } public class HttpHandlerAdapter implements HandlerAdapter { public void handle(Object handler) { ((HttpController)handler).doHttpHandler(); } public boolean supports(Object handler) { return (handler instanceof HttpController); } } public class AnnotationHandlerAdapter implements HandlerAdapter { public void handle(Object handler) { ((AnnotationController)handler).doAnnotationHandler(); } public boolean supports(Object handler) { return (handler instanceof AnnotationController); } } //模擬一個DispatcherServlet import java.util.ArrayList; import java.util.List; public class DispatchServlet { public static ListhandlerAdapters = new ArrayList (); public DispatchServlet(){ handlerAdapters.add(new AnnotationHandlerAdapter()); handlerAdapters.add(new HttpHandlerAdapter()); handlerAdapters.add(new SimpleHandlerAdapter()); } public void doDispatch(){ //此處模擬SpringMVC從request取handler的對象,僅僅new出,可以出, //不論實現(xiàn)何種Controller,適配器總能經(jīng)過適配以后得到想要的結(jié)果 //HttpController controller = new HttpController(); //AnnotationController controller = new AnnotationController(); SimpleController controller = new SimpleController(); //得到對應(yīng)適配器 HandlerAdapter adapter = getHandler(controller); //通過適配器執(zhí)行對應(yīng)的controller對應(yīng)方法 adapter.handle(controller); } //遍歷注入的handleradapter找到合適的適配器子類 public HandlerAdapter getHandler(Controller controller){ for(HandlerAdapter adapter: this.handlerAdapters){ if(adapter.supports(controller)){ return adapter; } } return null; } public static void main(String[] args){ new DispatchServlet().doDispatch(); } }
參考:看springmvc適配器模式---HandlerAdapter https://blog.csdn.net/a362212...
設(shè)計模式(十一)——適配器模式
https://www.hollischuang.com/...
《圖解設(shè)計模式》
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/75214.html
摘要:時間年月日星期二說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)源碼學(xué)習(xí)源碼第一章適配器模式的簡介簡介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個類的接口,轉(zhuǎn)換成客戶期望的另外一個接口。 時間:2017年08月29日星期二說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s.....
摘要:它通過數(shù)據(jù)模型進行鍵值綁定及事件處理,通過模型集合器提供一套豐富的用于枚舉功能,通過視圖來進行事件處理及與現(xiàn)有的通過接口進行交互。 本人兼職前端付費技術(shù)顧問,如需幫助請加本人微信hawx1993或QQ345823102,非誠勿擾 1.為初學(xué)前端而不知道怎么做項目的你指導(dǎo) 2.指導(dǎo)并扎實你的JavaScript基礎(chǔ) 3.幫你準(zhǔn)備面試并提供相關(guān)指導(dǎo)性意見 4.為你的前端之路提供極具建設(shè)性的...
摘要:在設(shè)計模式中,所有的設(shè)計模式都遵循這一原則。其實就是說在應(yīng)用程序中,所有的類如果使用或依賴于其他的類,則應(yīng)該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設(shè)計模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風(fēng)清揚-超全面的Java基礎(chǔ) 一、面向?qū)ο笏枷朐O(shè)計原則 1.單一職責(zé)原則 其實就是開發(fā)人員經(jīng)常說的高...
摘要:與門面模式的聯(lián)系本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。我們以中的一個為例,說說實際應(yīng)用中的適配器模式的使用方法。而如果實現(xiàn)層的問題不大,要解決一部分適配問題的話,適配器模式就是很好的選擇了。 與門面模式的聯(lián)系 本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。它們都對類的接口進行了一些改變。門面模式是把相似的或是完成相關(guān)任務(wù)的接...
摘要:的設(shè)計模式世界頂級足球射門錦集。重構(gòu)敏捷軟件開發(fā)設(shè)計模式解析一場場最精彩的足球比賽。但不屬于種設(shè)計模式之一。代理設(shè)計模式代理模式,為其他對象提供一種代理以控制對這個對象的訪問。 前言 編程是一門技術(shù),更是一門藝術(shù)。如果想成為一名更優(yōu)秀的軟件設(shè)計師,了解優(yōu)秀軟件設(shè)計的演變過程比學(xué)習(xí)優(yōu)秀設(shè)計本身更有價值,因為設(shè)計的演變過程中蘊藏著大智慧。學(xué)習(xí)設(shè)計模式,重要的不是你將來會不會用得到這些模式,...
閱讀 1748·2023-04-26 02:11
閱讀 3067·2023-04-25 16:18
閱讀 3772·2021-09-06 15:00
閱讀 2712·2019-08-30 15:55
閱讀 1996·2019-08-30 13:20
閱讀 2107·2019-08-26 18:36
閱讀 3200·2019-08-26 11:40
閱讀 2640·2019-08-26 10:11