成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

設(shè)計(jì)模式學(xué)習(xí)筆記:適配器模式

CompileYouth / 2737人閱讀

摘要:二適配器模式概念適配器模式是一種結(jié)構(gòu)型模式,它的思想是將一個(gè)接口轉(zhuǎn)化為另一個(gè)接口。適配器模式包含四個(gè)角色對(duì)象定義所需要的方法請(qǐng)求者負(fù)責(zé)使用對(duì)象定義的方法來(lái)做具體的處理被適配者以持有方法的角色適配器使用被適配者的方法來(lái)滿足對(duì)象的需要。

一、結(jié)構(gòu)型設(shè)計(jì)模式

1、概念
結(jié)構(gòu)型設(shè)計(jì)模式描述如何將類(lèi)或者對(duì)象結(jié)合在一起形成更為復(fù)雜,功能更為強(qiáng)大的結(jié)構(gòu)。

2、分類(lèi)
(1)類(lèi)結(jié)構(gòu)模型:這種結(jié)構(gòu)模型關(guān)心類(lèi)的組合,類(lèi)直接組合成一個(gè)更大的系統(tǒng),通常用繼承來(lái)建立這種關(guān)系。
(2)對(duì)象結(jié)構(gòu)模型:這種模型結(jié)構(gòu)關(guān)心類(lèi)與對(duì)象的組合,通常在一個(gè)類(lèi)中使用另一個(gè)類(lèi)的對(duì)象,再調(diào)用其方法。

注:“合成復(fù)用原則”規(guī)定盡量用關(guān)聯(lián)關(guān)系來(lái)代替繼承關(guān)系,因此一般使用對(duì)象結(jié)構(gòu)模型。

二、適配器模式

1、概念
適配器模式是一種結(jié)構(gòu)型模式,它的思想是將一個(gè)接口轉(zhuǎn)化為另一個(gè)接口。
適配器模式包含四個(gè)角色:
(1)對(duì)象:定義所需要的方法
(2)請(qǐng)求者:負(fù)責(zé)使用對(duì)象定義的方法來(lái)做具體的處理
(3)被適配者:以持有方法的角色
(4)適配器:使用被適配者的方法來(lái)滿足對(duì)象的需要。

2、代碼示例:使用安卓充電器給蘋(píng)果充電
(1)安卓和蘋(píng)果充電器接口

//安卓
public interface MicroUsbInterface {
    public void chargeWithMicroUsb();
}

//蘋(píng)果
public interface LightningInterface {
    public void chargeWithLightning();
}

(2)安卓設(shè)備充電器

public class AndroidCharger implements MicroUsbInterface {
    @Override
    public void chargeWithMicroUsb() {
        System.out.println("使用MicroUsb型號(hào)的充電器充電...");
    }
}

(3)適配器(用安卓充電器適配蘋(píng)果充電器)

public class Adapter implements LightningInterface {
    //將安卓充電器的接口作為一個(gè)字段
    private MicroUsbInterface microUsbInterface;

    public Adapter() {
    }

    public Adapter(MicroUsbInterface microUsbInterface) {
        this.microUsbInterface = microUsbInterface;
    }

    @Override
    public void chargeWithLightning() {
        //使用安卓充電器給蘋(píng)果設(shè)備充電
        microUsbInterface.chargeWithMicroUsb();
    }

    public MicroUsbInterface getMicroUsbInterface() {
        return microUsbInterface;
    }

    public void setMicroUsbInterface(MicroUsbInterface microUsbInterface) {
        this.microUsbInterface = microUsbInterface;
    }
}

在這個(gè)示例中,對(duì)象就是給蘋(píng)果手機(jī)充電,請(qǐng)求者就是蘋(píng)果手機(jī),被適配者是安卓充電器,適配器是用安卓充電器給蘋(píng)果手機(jī)充電的適配器。

3、適用場(chǎng)景
(1)系統(tǒng)想要使用現(xiàn)有類(lèi),但這個(gè)類(lèi)的接口不符合系統(tǒng)需要

(2)想要建立一個(gè)可以重復(fù)使用的類(lèi),用在一些沒(méi)有關(guān)聯(lián)的類(lèi)之間

(3)通過(guò)接口轉(zhuǎn)換將一個(gè)類(lèi)插到另一個(gè)類(lèi)系當(dāng)中。(比如新增一個(gè)飛狗類(lèi),就可以實(shí)現(xiàn)飛的接口,并且增加一個(gè)狗字段)

4、優(yōu)缺點(diǎn)
(1)優(yōu)點(diǎn):將目標(biāo)和被適配者解耦,通過(guò)適配器來(lái)關(guān)聯(lián),同時(shí)具有透明性、復(fù)用性、靈活性和擴(kuò)展性。

(2)缺點(diǎn):過(guò)度的使用適配器會(huì)讓系統(tǒng)顯得比較凌亂。

三、適配器應(yīng)用

1、SpringMVC的HandleAdapter使用了適配器模式的思想

SpringMVC中的handler(Controller,HttpRequestHandler,Servlet)的實(shí)現(xiàn)方式是多重的,可以是繼承controller的,也可能是注解控制器方式的。
因此如果是正常的調(diào)用,需要通過(guò)if else語(yǔ)句去判斷,這樣就會(huì)破壞開(kāi)閉原則。

為了解決這個(gè)問(wèn)題,Spring定義了一個(gè)適配接口,使得每一個(gè)handler都有一種對(duì)應(yīng)的適配器實(shí)現(xiàn)類(lèi), 讓適配器代替handler執(zhí)行相應(yīng)的方法。這樣在擴(kuò)展Controller 時(shí),只需要增加一個(gè)適配器類(lèi)就完成了SpringMVC的擴(kuò)展了。

//定義一個(gè)Adapter接口  
public interface HandlerAdapter {  
    public boolean supports(Object handler);  
    public void handle(Object handler);  
}  
這是一段模擬的代碼
//以下是三種Controller實(shí)現(xiàn)  
public interface Controller {  

}  
//HTTP請(qǐng)求處理器
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...");  
    }  
}  


//下面編寫(xiě)適配器類(lèi)  

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);  
    }  

}  


//模擬一個(gè)DispatcherServlet  
import java.util.ArrayList;  
import java.util.List;  

public class DispatchServlet {  

    public static List handlerAdapters = new ArrayList();   

    public DispatchServlet(){  
        handlerAdapters.add(new AnnotationHandlerAdapter());  
        handlerAdapters.add(new HttpHandlerAdapter());  
        handlerAdapters.add(new SimpleHandlerAdapter());  
    }  


    public void doDispatch(){  

       //此處模擬SpringMVC從request取handler的對(duì)象,僅僅new出,可以出,               
       //不論實(shí)現(xiàn)何種Controller,適配器總能經(jīng)過(guò)適配以后得到想要的結(jié)果  
       //HttpController controller = new HttpController();  
       //AnnotationController controller = new AnnotationController();  
        SimpleController controller = new SimpleController();  
        //得到對(duì)應(yīng)適配器  
        HandlerAdapter adapter = getHandler(controller);  
        //通過(guò)適配器執(zhí)行對(duì)應(yīng)的controller對(duì)應(yīng)方法  
        adapter.handle(controller);  
    }  

//遍歷注入的handleradapter找到合適的適配器子類(lèi)
    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è)計(jì)模式(十一)——適配器模式
https://www.hollischuang.com/...
《圖解設(shè)計(jì)模式》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75214.html

相關(guān)文章

  • 慕課網(wǎng)_《模式的秘密之配器模式學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期二說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。慕課網(wǎng)教學(xué)源碼學(xué)習(xí)源碼第一章適配器模式的簡(jiǎn)介簡(jiǎn)介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個(gè)類(lèi)的接口,轉(zhuǎn)換成客戶期望的另外一個(gè)接口。 時(shí)間:2017年08月29日星期二說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s.....

    andong777 評(píng)論0 收藏0
  • Backbone.js學(xué)習(xí)筆記(一)

    摘要:它通過(guò)數(shù)據(jù)模型進(jìn)行鍵值綁定及事件處理,通過(guò)模型集合器提供一套豐富的用于枚舉功能,通過(guò)視圖來(lái)進(jìn)行事件處理及與現(xiàn)有的通過(guò)接口進(jìn)行交互。 本人兼職前端付費(fèi)技術(shù)顧問(wèn),如需幫助請(qǐng)加本人微信hawx1993或QQ345823102,非誠(chéng)勿擾 1.為初學(xué)前端而不知道怎么做項(xiàng)目的你指導(dǎo) 2.指導(dǎo)并扎實(shí)你的JavaScript基礎(chǔ) 3.幫你準(zhǔn)備面試并提供相關(guān)指導(dǎo)性意見(jiàn) 4.為你的前端之路提供極具建設(shè)性的...

    FrancisSoung 評(píng)論0 收藏0
  • (CZ深入淺出Java基礎(chǔ))設(shè)計(jì)模式筆記

    摘要:在設(shè)計(jì)模式中,所有的設(shè)計(jì)模式都遵循這一原則。其實(shí)就是說(shuō)在應(yīng)用程序中,所有的類(lèi)如果使用或依賴于其他的類(lèi),則應(yīng)該依賴這些其他類(lèi)的抽象類(lèi),而不是這些其他類(lèi)的具體類(lèi)。使用設(shè)計(jì)模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門(mén) 傳智風(fēng)清揚(yáng)-超全面的Java基礎(chǔ) 一、面向?qū)ο笏枷朐O(shè)計(jì)原則 1.單一職責(zé)原則 其實(shí)就是開(kāi)發(fā)人員經(jīng)常說(shuō)的高...

    李昌杰 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式讀書(shū)筆記(七)——配器模式

    摘要:與門(mén)面模式的聯(lián)系本文要說(shuō)的適配器模式和上一篇門(mén)面模式在思想上有相似之處,所以放在一起說(shuō)。我們以中的一個(gè)為例,說(shuō)說(shuō)實(shí)際應(yīng)用中的適配器模式的使用方法。而如果實(shí)現(xiàn)層的問(wèn)題不大,要解決一部分適配問(wèn)題的話,適配器模式就是很好的選擇了。 與門(mén)面模式的聯(lián)系 本文要說(shuō)的適配器模式和上一篇門(mén)面模式在思想上有相似之處,所以放在一起說(shuō)。它們都對(duì)類(lèi)的接口進(jìn)行了一些改變。門(mén)面模式是把相似的或是完成相關(guān)任務(wù)的接...

    AZmake 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式學(xué)習(xí)總結(jié)

    摘要:的設(shè)計(jì)模式世界頂級(jí)足球射門(mén)錦集。重構(gòu)敏捷軟件開(kāi)發(fā)設(shè)計(jì)模式解析一場(chǎng)場(chǎng)最精彩的足球比賽。但不屬于種設(shè)計(jì)模式之一。代理設(shè)計(jì)模式代理模式,為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。 前言 編程是一門(mén)技術(shù),更是一門(mén)藝術(shù)。如果想成為一名更優(yōu)秀的軟件設(shè)計(jì)師,了解優(yōu)秀軟件設(shè)計(jì)的演變過(guò)程比學(xué)習(xí)優(yōu)秀設(shè)計(jì)本身更有價(jià)值,因?yàn)樵O(shè)計(jì)的演變過(guò)程中蘊(yùn)藏著大智慧。學(xué)習(xí)設(shè)計(jì)模式,重要的不是你將來(lái)會(huì)不會(huì)用得到這些模式,...

    songze 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

CompileYouth

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<