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

資訊專欄INFORMATION COLUMN

當(dāng)我談Proxy與Adpater模式時(shí),我談些什么

incredible / 3719人閱讀

摘要:適配器模式屬于兩種適應(yīng)設(shè)計(jì)模式中的其中一種,另外一種是迭代器模式,下次有機(jī)會(huì)再仔細(xì)聊聊它。設(shè)計(jì)模式的書很喜歡以電源適配器插頭作為適配器模式的范例范例,那么我們也從這個(gè)例子開(kāi)始吧。

當(dāng)我談Proxy與Adpater模式時(shí),我談些什么 前言

今天跟同事談起了一道面試題:“Proxy模式跟Adpater模式的區(qū)別”,這兩個(gè)設(shè)計(jì)模式都是很相似的模式,很多有點(diǎn)經(jīng)驗(yàn)的程序員都可能會(huì)聊的頭頭是道,但是恐怕談起一些設(shè)計(jì)上的細(xì)節(jié)可能就會(huì)卡殼,因此我寫下了這篇文章,以此作為一個(gè)簡(jiǎn)短的回顧。

Adapter(適配器)模式

Adpater屬于兩種適應(yīng)設(shè)計(jì)模式中的其中一種,另外一種是Iterator(迭代器)模式,下次有機(jī)會(huì)再仔細(xì)聊聊它。

設(shè)計(jì)模式的書很喜歡以‘電源適配器插頭’作為適配器模式的范例范例,那么我們也從這個(gè)例子開(kāi)始吧。

參與模式的角色
1. Target (適配接口)

暴露給調(diào)用方的接口,定義了被適配對(duì)象暴露的方法。(我們需要220V的電源)

2. Client (請(qǐng)求者)

實(shí)際需要使用接口的邏輯(某電器需要使用220V的電源)

3. Adaptee(被適配對(duì)象)

被適配者,包含了具體的實(shí)現(xiàn),及可能不太合適調(diào)用方使用的方法。(110V的電源不合適現(xiàn)在所用的電器)

4. Adpater(適配器)

實(shí)際適配的實(shí)現(xiàn),用繼承的方式隱藏了被適配對(duì)象的實(shí)現(xiàn),又以實(shí)現(xiàn)適配接口的方式暴露調(diào)用者適合的方法。

UML類圖

范例代碼

下面的代碼實(shí)現(xiàn)了一個(gè)輸出110V的電源,通過(guò)220V電源適配器,實(shí)現(xiàn)了一個(gè)符合22V標(biāo)準(zhǔn)接口的輸出,提供給客戶端的示范。

#  adpatee
public class Power110v {

    private int volte = 110;
    
    public Power110v(){
        System.out.print("the power is on at "+volte+"V");
    }
    
    public String get100vPower(){
        return volte;    
    }
    
}

# target
public interface Power220v {
    get220vPower(String input);
}

# adapter 
public PowerAdpater extends Power110v implemnts Power220v {
    
    public get220vPower(){
        volte = volte * 2;
        System.out.println("the power is on at "+volte+"V")
    }
    
}

#client
public class Main (){
    
    public static void main(String[] args){
    
        PowerAdapter pa = new PowerAdapter();
        pa.get220vPower();
        
    }
    
}
小結(jié)

Adapter模式適用于那些已有代碼很穩(wěn)定,但新調(diào)用方需要對(duì)部分代碼進(jìn)行調(diào)整,或者組合多個(gè)方法進(jìn)行組合實(shí)現(xiàn)邏輯的情況下適用。可以盡量適用已有的穩(wěn)定代碼,只作適當(dāng)?shù)男薷谋憧梢酝瓿尚碌倪壿嫻δ堋?/p> Proxy模式 參與模式的角色 1. Client

使用proxy的角色,功能的調(diào)用方,下面的例子是Manager(經(jīng)理)類。

2. Subject

定義了proxy角色與RealSubject的一致性接口,范例代碼中,是Reportable(可匯報(bào))接口,

3. Proxy

Proxy會(huì)處理來(lái)自Client的請(qǐng)求,可以處理的功能自己處理,不能處理的功能讓RealSubject處理,范例代碼是TeamLeader類。

4. RealSubject

RealSubject將會(huì)在Proxy缺乏功能時(shí)提供實(shí)現(xiàn),跟Proxy一樣實(shí)現(xiàn)同樣的接口,范例代碼中是TeamMember類。

UML

范例代碼
public interface Reportable{
    public void setReportMatrial(String jobContent);
    public String getReportMatrial();
    public String getFeedback();
}

public TeamMember implements Reportable{
    String reportMatrial;
    
    public void setReportMatrial(String input){
        this.reportMatrial = input;
    }
    
    public String getReportMatrial(){
        return this.reportMatrial;
    }
    
    public String getFeedback(){
        return "Here is the report content ["+this.reportMatrial+"]";
    }
}
    
}

public TeamLeader implements Reportable{

    String reportMatrial;
    TeamMember member;
    
    public TeamLeader(String input){
        this.reportMatrial = input;
    }
    
    public void setReportMatrial(String input){
        if (member != null){
            member.setReportMatrial(input)
        }
        this.reportMatrial = input;
    }
    
    public String getReportMatrial(){
        return this.reportMatrial;
    }
    
    public String getFeedback(){
        if ( member != null ){
            return member.getFeedback();
        }
        member = new TeamMember();
        member.setReportMatrial(this.reportMatrial);
    }
    
    
}

public class Manager {
    public static void main(String[] args){
        TeamLeader tl = new TeamLeader("monthly report");
        tl.setReportMatrial("weekly report")
        String currentReportType = tl.getReportMatrial();
        // the manager forgot what kind report should receive
        System.out.println("the current report type is " + currentReportType);
        // the manager ask the teamleader for the report detail.
        System.out.println("get some report from team leader"tl.getFeedback());
    }
}
Proxy與Adpater的總結(jié) 相同點(diǎn)

兩者頭通過(guò)實(shí)現(xiàn)接口暴露實(shí)際邏輯給調(diào)用方,核心邏輯都在最內(nèi)一層的類中。

不同點(diǎn)

Proxy實(shí)現(xiàn)subject類與proxy類,都是實(shí)現(xiàn)一樣的接口,暴露一樣的方法。Adpater模式則Adpater與Adpatee則不一定實(shí)現(xiàn)同樣的方法。理論上Proxy模式的proxy類,也承擔(dān)一部分的功能,當(dāng)它無(wú)法實(shí)現(xiàn)調(diào)用功能時(shí)才會(huì)創(chuàng)建被代理的RealSubject類。Adpater類則原則上與Adpatee共存亡。

參考資料

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

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

相關(guān)文章

  • 當(dāng)我談vim映射時(shí),我談什么

    摘要:注意不僅能映射單個(gè)鍵,還能映射一組鍵,比如臉滾鍵盤。通過(guò)命令可以顯示當(dāng)前鍵映射的情況。表示不允許映射的結(jié)果參與其他的映射規(guī)則的匹配。當(dāng)然也有用武之地,比如當(dāng)你需要映射的結(jié)果來(lái)觸發(fā)另一個(gè)映射時(shí),就用得上了。 映射功能是當(dāng)下各大編輯器的標(biāo)配,如果你想要熟悉所用的編輯器,必然不能缺少對(duì)它的映射機(jī)制的學(xué)習(xí)。對(duì)于vim亦是如此。 這里說(shuō)到的映射功能,指的是編輯器會(huì)捕獲用戶的輸入,并且按照事先的...

    GHOST_349178 評(píng)論0 收藏0
  • 當(dāng)我談緩存的時(shí)候,我談什么

    摘要:對(duì),當(dāng)談到緩存的時(shí)候,就是指那些設(shè)備,如瀏覽器,代理緩存服務(wù)器等。保持副本的新鮮服務(wù)器上的文本內(nèi)容隨時(shí)可能發(fā)生變化,如淘寶首頁(yè)的一個(gè)文件中需要增加記錄用戶點(diǎn)擊日志的功能,所以需要修改某個(gè)文件,以增加對(duì)應(yīng)的功能。 TL;DR 前面大段的內(nèi)容都是基本概念的介紹,建議沒(méi)時(shí)間的同學(xué)直接拖到最下面看。 Web 緩存是可以自動(dòng)保存常見(jiàn)文檔副本的 HTTP 設(shè)備。對(duì),當(dāng)談到緩存的時(shí)候,就是指那...

    Lsnsh 評(píng)論0 收藏0
  • 當(dāng)談?wù)摰?em>時(shí),我談什么?

    摘要:示例代碼如下此示例中可以看出,當(dāng)?shù)鹘K止時(shí),通過(guò)拋出異常告知迭代器已耗盡。但如果迭代器所指向的數(shù)據(jù)結(jié)構(gòu)在其存在時(shí)發(fā)生了插入或刪除操作,則迭代器將可能失效。與的情形類似,對(duì)進(jìn)行任何插入操作也將損壞迭代器。 花下貓語(yǔ):之前說(shuō)過(guò),我對(duì)于編程語(yǔ)言跟其它學(xué)科的融合非常感興趣,但我還說(shuō)漏了一點(diǎn),就是我對(duì)于 Python 跟其它編程語(yǔ)言的對(duì)比學(xué)習(xí),也很感興趣。所以,我一直希望能聚集一些有其它語(yǔ)言基...

    王軍 評(píng)論0 收藏0
  • lodash源碼分析之自減的兩種形式

    摘要:作用與用法是的內(nèi)部函數(shù),之前在源碼分析之緩存介紹過(guò)一種這樣的數(shù)據(jù)結(jié)構(gòu)這是一個(gè)二維數(shù)組,每項(xiàng)中的第一項(xiàng)作為緩存對(duì)象的,第二項(xiàng)為緩存的值。 這個(gè)世界需要一個(gè)特定的惡人,可以供人們指名道姓,千夫所指:全都怪你。——村上春樹(shù)《當(dāng)我談跑步時(shí)我談些什么》 本文為讀 lodash 源碼的第六篇,后續(xù)文章會(huì)更新到這個(gè)倉(cāng)庫(kù)中,歡迎 star:pocket-lodash gitbook也會(huì)同步倉(cāng)庫(kù)的更新...

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

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

0條評(píng)論

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