摘要:適配器模式屬于兩種適應(yīng)設(shè)計模式中的其中一種,另外一種是迭代器模式,下次有機(jī)會再仔細(xì)聊聊它。設(shè)計模式的書很喜歡以電源適配器插頭作為適配器模式的范例范例,那么我們也從這個例子開始吧。
當(dāng)我談Proxy與Adpater模式時,我談些什么 前言
今天跟同事談起了一道面試題:“Proxy模式跟Adpater模式的區(qū)別”,這兩個設(shè)計模式都是很相似的模式,很多有點經(jīng)驗的程序員都可能會聊的頭頭是道,但是恐怕談起一些設(shè)計上的細(xì)節(jié)可能就會卡殼,因此我寫下了這篇文章,以此作為一個簡短的回顧。
Adapter(適配器)模式Adpater屬于兩種適應(yīng)設(shè)計模式中的其中一種,另外一種是Iterator(迭代器)模式,下次有機(jī)會再仔細(xì)聊聊它。
設(shè)計模式的書很喜歡以‘電源適配器插頭’作為適配器模式的范例范例,那么我們也從這個例子開始吧。
參與模式的角色暴露給調(diào)用方的接口,定義了被適配對象暴露的方法。(我們需要220V的電源)
實際需要使用接口的邏輯(某電器需要使用220V的電源)
被適配者,包含了具體的實現(xiàn),及可能不太合適調(diào)用方使用的方法。(110V的電源不合適現(xiàn)在所用的電器)
實際適配的實現(xiàn),用繼承的方式隱藏了被適配對象的實現(xiàn),又以實現(xiàn)適配接口的方式暴露調(diào)用者適合的方法。
UML類圖 范例代碼下面的代碼實現(xiàn)了一個輸出110V的電源,通過220V電源適配器,實現(xiàn)了一個符合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)用方需要對部分代碼進(jìn)行調(diào)整,或者組合多個方法進(jìn)行組合實現(xiàn)邏輯的情況下適用??梢员M量適用已有的穩(wěn)定代碼,只作適當(dāng)?shù)男薷谋憧梢酝瓿尚碌倪壿嫻δ堋?/p> Proxy模式 參與模式的角色 1. Client
使用proxy的角色,功能的調(diào)用方,下面的例子是Manager(經(jīng)理)類。
2. Subject定義了proxy角色與RealSubject的一致性接口,范例代碼中,是Reportable(可匯報)接口,
3. ProxyProxy會處理來自Client的請求,可以處理的功能自己處理,不能處理的功能讓RealSubject處理,范例代碼是TeamLeader類。
4. RealSubjectRealSubject將會在Proxy缺乏功能時提供實現(xiàn),跟Proxy一樣實現(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é) 相同點
兩者頭通過實現(xiàn)接口暴露實際邏輯給調(diào)用方,核心邏輯都在最內(nèi)一層的類中。
不同點Proxy實現(xiàn)subject類與proxy類,都是實現(xiàn)一樣的接口,暴露一樣的方法。Adpater模式則Adpater與Adpatee則不一定實現(xiàn)同樣的方法。理論上Proxy模式的proxy類,也承擔(dān)一部分的功能,當(dāng)它無法實現(xiàn)調(diào)用功能時才會創(chuàng)建被代理的RealSubject類。Adpater類則原則上與Adpatee共存亡。
參考資料文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/76512.html
摘要:注意不僅能映射單個鍵,還能映射一組鍵,比如臉滾鍵盤。通過命令可以顯示當(dāng)前鍵映射的情況。表示不允許映射的結(jié)果參與其他的映射規(guī)則的匹配。當(dāng)然也有用武之地,比如當(dāng)你需要映射的結(jié)果來觸發(fā)另一個映射時,就用得上了。 映射功能是當(dāng)下各大編輯器的標(biāo)配,如果你想要熟悉所用的編輯器,必然不能缺少對它的映射機(jī)制的學(xué)習(xí)。對于vim亦是如此。 這里說到的映射功能,指的是編輯器會捕獲用戶的輸入,并且按照事先的...
摘要:對,當(dāng)談到緩存的時候,就是指那些設(shè)備,如瀏覽器,代理緩存服務(wù)器等。保持副本的新鮮服務(wù)器上的文本內(nèi)容隨時可能發(fā)生變化,如淘寶首頁的一個文件中需要增加記錄用戶點擊日志的功能,所以需要修改某個文件,以增加對應(yīng)的功能。 TL;DR 前面大段的內(nèi)容都是基本概念的介紹,建議沒時間的同學(xué)直接拖到最下面看。 Web 緩存是可以自動保存常見文檔副本的 HTTP 設(shè)備。對,當(dāng)談到緩存的時候,就是指那...
摘要:示例代碼如下此示例中可以看出,當(dāng)?shù)鹘K止時,通過拋出異常告知迭代器已耗盡。但如果迭代器所指向的數(shù)據(jù)結(jié)構(gòu)在其存在時發(fā)生了插入或刪除操作,則迭代器將可能失效。與的情形類似,對進(jìn)行任何插入操作也將損壞迭代器。 花下貓語:之前說過,我對于編程語言跟其它學(xué)科的融合非常感興趣,但我還說漏了一點,就是我對于 Python 跟其它編程語言的對比學(xué)習(xí),也很感興趣。所以,我一直希望能聚集一些有其它語言基...
摘要:作用與用法是的內(nèi)部函數(shù),之前在源碼分析之緩存介紹過一種這樣的數(shù)據(jù)結(jié)構(gòu)這是一個二維數(shù)組,每項中的第一項作為緩存對象的,第二項為緩存的值。 這個世界需要一個特定的惡人,可以供人們指名道姓,千夫所指:全都怪你?!迳洗簶洹懂?dāng)我談跑步時我談些什么》 本文為讀 lodash 源碼的第六篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-lodash gitbook也會同步倉庫的更新...
閱讀 1866·2023-04-26 01:41
閱讀 3169·2021-11-23 09:51
閱讀 2819·2021-10-09 09:43
閱讀 9354·2021-09-22 15:13
閱讀 2526·2021-09-07 09:59
閱讀 2687·2019-08-30 15:44
閱讀 1196·2019-08-30 12:45
閱讀 2680·2019-08-30 12:43