摘要:二適配器模式概念適配器模式是一種結構型模式,它的思想是將一個接口轉化為另一個接口。適配器模式包含四個角色對象定義所需要的方法請求者負責使用對象定義的方法來做具體的處理被適配者以持有方法的角色適配器使用被適配者的方法來滿足對象的需要。
一、結構型設計模式
1、概念
結構型設計模式描述如何將類或者對象結合在一起形成更為復雜,功能更為強大的結構。
2、分類
(1)類結構模型:這種結構模型關心類的組合,類直接組合成一個更大的系統,通常用繼承來建立這種關系。
(2)對象結構模型:這種模型結構關心類與對象的組合,通常在一個類中使用另一個類的對象,再調用其方法。
注:“合成復用原則”規定盡量用關聯關系來代替繼承關系,因此一般使用對象結構模型。
二、適配器模式1、概念
適配器模式是一種結構型模式,它的思想是將一個接口轉化為另一個接口。
適配器模式包含四個角色:
(1)對象:定義所需要的方法
(2)請求者:負責使用對象定義的方法來做具體的處理
(3)被適配者:以持有方法的角色
(4)適配器:使用被適配者的方法來滿足對象的需要。
2、代碼示例:使用安卓充電器給蘋果充電
(1)安卓和蘋果充電器接口
//安卓 public interface MicroUsbInterface { public void chargeWithMicroUsb(); } //蘋果 public interface LightningInterface { public void chargeWithLightning(); }
(2)安卓設備充電器
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() { //使用安卓充電器給蘋果設備充電 microUsbInterface.chargeWithMicroUsb(); } public MicroUsbInterface getMicroUsbInterface() { return microUsbInterface; } public void setMicroUsbInterface(MicroUsbInterface microUsbInterface) { this.microUsbInterface = microUsbInterface; } }
在這個示例中,對象就是給蘋果手機充電,請求者就是蘋果手機,被適配者是安卓充電器,適配器是用安卓充電器給蘋果手機充電的適配器。
3、適用場景
(1)系統想要使用現有類,但這個類的接口不符合系統需要
(2)想要建立一個可以重復使用的類,用在一些沒有關聯的類之間
(3)通過接口轉換將一個類插到另一個類系當中。(比如新增一個飛狗類,就可以實現飛的接口,并且增加一個狗字段)
4、優缺點
(1)優點:將目標和被適配者解耦,通過適配器來關聯,同時具有透明性、復用性、靈活性和擴展性。
(2)缺點:過度的使用適配器會讓系統顯得比較凌亂。
三、適配器應用1、SpringMVC的HandleAdapter使用了適配器模式的思想
SpringMVC中的handler(Controller,HttpRequestHandler,Servlet)的實現方式是多重的,可以是繼承controller的,也可能是注解控制器方式的。
因此如果是正常的調用,需要通過if else語句去判斷,這樣就會破壞開閉原則。
為了解決這個問題,Spring定義了一個適配接口,使得每一個handler都有一種對應的適配器實現類, 讓適配器代替handler執行相應的方法。這樣在擴展Controller 時,只需要增加一個適配器類就完成了SpringMVC的擴展了。
//定義一個Adapter接口 public interface HandlerAdapter { public boolean supports(Object handler); public void handle(Object handler); } 這是一段模擬的代碼 //以下是三種Controller實現 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出,可以出, //不論實現何種Controller,適配器總能經過適配以后得到想要的結果 //HttpController controller = new HttpController(); //AnnotationController controller = new AnnotationController(); SimpleController controller = new SimpleController(); //得到對應適配器 HandlerAdapter adapter = getHandler(controller); //通過適配器執行對應的controller對應方法 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...
設計模式(十一)——適配器模式
https://www.hollischuang.com/...
《圖解設計模式》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75214.html
摘要:時間年月日星期二說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章適配器模式的簡介簡介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個類的接口,轉換成客戶期望的另外一個接口。 時間:2017年08月29日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s.....
摘要:它通過數據模型進行鍵值綁定及事件處理,通過模型集合器提供一套豐富的用于枚舉功能,通過視圖來進行事件處理及與現有的通過接口進行交互。 本人兼職前端付費技術顧問,如需幫助請加本人微信hawx1993或QQ345823102,非誠勿擾 1.為初學前端而不知道怎么做項目的你指導 2.指導并扎實你的JavaScript基礎 3.幫你準備面試并提供相關指導性意見 4.為你的前端之路提供極具建設性的...
摘要:在設計模式中,所有的設計模式都遵循這一原則。其實就是說在應用程序中,所有的類如果使用或依賴于其他的類,則應該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設計模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎教程的筆記講的賊好,附上傳送門 傳智風清揚-超全面的Java基礎 一、面向對象思想設計原則 1.單一職責原則 其實就是開發人員經常說的高...
摘要:與門面模式的聯系本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。我們以中的一個為例,說說實際應用中的適配器模式的使用方法。而如果實現層的問題不大,要解決一部分適配問題的話,適配器模式就是很好的選擇了。 與門面模式的聯系 本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。它們都對類的接口進行了一些改變。門面模式是把相似的或是完成相關任務的接...
摘要:的設計模式世界頂級足球射門錦集。重構敏捷軟件開發設計模式解析一場場最精彩的足球比賽。但不屬于種設計模式之一。代理設計模式代理模式,為其他對象提供一種代理以控制對這個對象的訪問。 前言 編程是一門技術,更是一門藝術。如果想成為一名更優秀的軟件設計師,了解優秀軟件設計的演變過程比學習優秀設計本身更有價值,因為設計的演變過程中蘊藏著大智慧。學習設計模式,重要的不是你將來會不會用得到這些模式,...
閱讀 1634·2023-04-26 02:11
閱讀 2979·2023-04-25 16:18
閱讀 3711·2021-09-06 15:00
閱讀 2630·2019-08-30 15:55
閱讀 1934·2019-08-30 13:20
閱讀 2051·2019-08-26 18:36
閱讀 3121·2019-08-26 11:40
閱讀 2538·2019-08-26 10:11