设计模式(八): 从“小弟”中来类比外观模式(Facade Pattern)
在此先容我拿“小弟”這個(gè)詞來(lái)扯一下淡。什么是小弟呢,所謂小弟就是可以幫你做一些瑣碎的事情,在此我們就拿“小弟”來(lái)類比“外觀模式”。在上面一篇博文我們完整的介紹了“適配器模式”,接下來(lái)我們將要在這篇博客中介紹“外觀模式”(Facade Pattern)。其實(shí)外觀模式與之前我們介紹過(guò)的“命令模式”有些相似之處,都是對(duì)方法的封裝。但兩者有著明顯的不同,命令模式是對(duì)同一個(gè)對(duì)象中的不同方法進(jìn)行封裝,而外觀模式是對(duì)多個(gè)對(duì)象中的多個(gè)方法進(jìn)行封裝。當(dāng)然在實(shí)現(xiàn)時(shí)我們要循序“依賴接口而不依賴具體實(shí)現(xiàn)”的原則。更確切的說(shuō)“外觀模式”是對(duì)多個(gè)接口進(jìn)行整合,以簡(jiǎn)化用戶調(diào)用的方式。下方是外觀模式的定義:
外觀模式:提供了一個(gè)統(tǒng)一的接口,用來(lái)訪問(wèn)子系統(tǒng)中的一群接口。外觀定義了一個(gè)高層接口,讓子系統(tǒng)更容易使用。
定義一般都是不太好理解的,那么接下來(lái)讓我們通俗易懂的來(lái)解釋一下外觀模式。比如你做一件事情需要三步,你必須挨個(gè)的去執(zhí)行。如果你使用外觀模式進(jìn)行簡(jiǎn)化后,你只需要執(zhí)行外觀模式中的一步即可,因?yàn)檫@一步會(huì)包括你之前執(zhí)行的三步。當(dāng)然“外觀模式”并不是對(duì)你之前要執(zhí)行的三步的東西進(jìn)行封裝,使用“外觀模式”后你仍然可以親自的去執(zhí)行之前的那三步。
接下來(lái)我們將通過(guò)一個(gè)示例來(lái)認(rèn)識(shí)一下“外觀模式”,就以上面的工作三部曲為例。就以我為例吧,每天早晨上班,我都會(huì)做三件事情:第一,打開(kāi)插排;第二,打開(kāi)MacBook;第三步,打開(kāi)外接顯示器(當(dāng)然如果你沒(méi)有小弟就要自己去做這些事情了)。接下來(lái)我們將通過(guò)模擬這三件事情來(lái)學(xué)習(xí)一下我們的外觀模式。下方先給出沒(méi)有外觀模式的類圖與代碼實(shí)現(xiàn),然后在此基礎(chǔ)上給出使用“外觀模式”的類圖與代碼實(shí)現(xiàn)。
?
一、沒(méi)有小弟(無(wú)“外觀模式”)的情況下的類圖與代碼實(shí)現(xiàn)
如果你沒(méi)有小弟,那么你就得事必躬親了。該部分我們將會(huì)把上面的“工作三部曲”用代碼去實(shí)現(xiàn),當(dāng)然在實(shí)現(xiàn)是依然是我們之前的風(fēng)格。下方我們會(huì)先給出類圖,然后在給出代碼實(shí)現(xiàn),最后給出測(cè)試用例。測(cè)試用例就是用戶對(duì)插排、MacBook Pro、顯示器進(jìn)行相應(yīng)的操作。當(dāng)然下班時(shí)也要做一些相應(yīng)的操作,下班所做的操作與上班所做的操作正好相反,在下方的測(cè)試用例中我們也給出了相應(yīng)的實(shí)現(xiàn)。廢話少說(shuō),開(kāi)始我們的實(shí)現(xiàn)。
1、無(wú)“小弟”的類圖(無(wú)外觀模式)
下方的截圖是沒(méi)有使用外觀模式的類圖。在下方類圖中有三個(gè)協(xié)議(接口),分別是SocketType(插排協(xié)議)、ComputerType(計(jì)算機(jī)協(xié)議)和DisplayDeviceType(顯示器設(shè)備協(xié)議)。OXSocket(公牛插座)、MacBookPro和SamsungDisplay(三星的顯示器)又分別實(shí)現(xiàn)了這些協(xié)議。Client客戶端(也就是我了)依賴于這三種物品的接口而不依賴于具體實(shí)現(xiàn)。也就是說(shuō)我打開(kāi)的只要是插排就行,至于什么品牌我不關(guān)心,只要符合要求即可。
? ?
?
2、代碼實(shí)現(xiàn)
有了上面的類圖我們給出代碼實(shí)現(xiàn)就不成問(wèn)題了,因?yàn)闇y(cè)試用例就是我們的Client,在此我們就不詳細(xì)的給出Client類了。關(guān)于Client類中的內(nèi)容請(qǐng)參見(jiàn)下方的測(cè)試用例。下方黃框中的是我們插排接口與公牛插座的具體代碼,其中on()是打開(kāi),off()是關(guān)閉。下方的綠框中是我們筆記本接口與MacBook Pro的代碼實(shí)現(xiàn),startUp()是啟動(dòng),shutdown()是關(guān)閉。最后一個(gè)紅框中的代碼是顯示器接口與三星顯示器的代碼實(shí)現(xiàn),其中on()是打開(kāi),off()是關(guān)閉。具體代碼如下所示:
? ?
?
3.測(cè)試用例
在沒(méi)用外觀模式的情況下,我們的Client仍然可以逐一的使用上述代碼。測(cè)試用例就是我們Client中的代碼,因?yàn)槲覀兪窃赑layground中進(jìn)行測(cè)試的,再次就不在創(chuàng)建Client類了,下方的代碼就是Client中的代碼。在下方的代碼段中,我們先創(chuàng)建了我們需要的對(duì)象(公牛插座、MacBook Por以及三星的顯示屏)。緊接著是上班要做的三件事情(開(kāi)插座、啟動(dòng)計(jì)算機(jī)、打開(kāi)外接顯示器),然后給出了下班要做的事情(關(guān)外接顯示器、關(guān)閉計(jì)算機(jī)、關(guān)插座)。具體代碼如下所示:
??
下方截圖就是上述測(cè)試用例輸出的結(jié)果,至此我們沒(méi)有使用“外觀模式”的代碼就實(shí)現(xiàn)完畢。
? ? ?
?
二、你收了個(gè)小弟(添加“外觀模式”)
現(xiàn)在你收了個(gè)小弟,接下來(lái)該你“小弟”出場(chǎng)了。在上面的測(cè)試用例中,也就是我們Client調(diào)用上述對(duì)象做一些事情時(shí)我們會(huì)發(fā)現(xiàn)過(guò)程有些繁瑣,能不能簡(jiǎn)化一下上述操作呢。也就是說(shuō)用戶只需要只需一步就可以將插座、筆記本、外接顯示器給打開(kāi)呢?當(dāng)然可以,舉個(gè)例子,假如你是公司比較NX的人物,又假如你下邊有好多小弟,上面這些東西就可以完全交個(gè)你的小弟去做。比如你說(shuō)我要工作了,然后你的小弟就會(huì)幫你打開(kāi)插座,啟動(dòng)MacBookPro,打開(kāi)顯示器。如果你說(shuō)我要下班了,然后你這個(gè)小弟呀,又屁顛屁顛的把顯示器關(guān)掉,將筆記本和插排關(guān)掉。
我們來(lái)對(duì)比一下,沒(méi)有“小弟”之前你上下班得做六件事情。但是如果你有了“小弟”的話,你上下班就需要兩件事情,就是告訴你的“小弟”你何時(shí)下班何時(shí)上班。這個(gè)“小弟”在此扮演的角色就是“外觀模式”。言歸正傳,“外觀模式”就如同小弟一樣可以簡(jiǎn)化你的操作,接下來(lái)我們就在上一部分的基礎(chǔ)上添加一個(gè)“外觀”類(也就是我們的小弟了),將上面我們那些瑣碎的工作交給我們的“小弟”去做。
1、帶有“小弟”的類圖
我們將上述沒(méi)有“小弟”的類圖添加上“小弟”,也就是添加刪“外觀模式”所需要的外觀類。下方這個(gè)截圖中就是帶有“小弟”的類圖,上面的那個(gè)紅框中的EveryDayWorking就是我們的“小弟”類,也就是外觀模式所需要的“外觀”類。其中定義了上述我們沒(méi)有“小弟”時(shí)要做的事情。EveryDayWorking依賴于插排接口、計(jì)算機(jī)接口和顯示器接口。我們的Client就可以使用這個(gè)外觀類EveryDayWorking做我們之前做的事情。簡(jiǎn)化了Client的一些操作。如下所示:
? ?
?
2、“小弟”的具體代碼實(shí)現(xiàn)
有上面的類圖可知,我們沒(méi)有修改之前的任何代碼,只是在原來(lái)的基礎(chǔ)上添加了一個(gè)EveryDayWorking類。所以在代碼實(shí)現(xiàn)時(shí)我們只需要添加上這個(gè)類即可,下方代碼片段就是EveryDayWorking類的具體實(shí)現(xiàn)。在下方代碼片段中的startWorking()方法就是我們之前上班時(shí)要親自做的三件事情,而endWorking()就是我們下班時(shí)要做的事情。現(xiàn)在我們都交給了我們的小弟去做,具體如下所示:
? ?
?
3、給“小弟”派工作
給“小弟”派工作,其實(shí)就是我們的測(cè)試用例。我們添加完EveryDayWorking類后,我們就可以委托EveryDayWorking來(lái)做之前那些瑣碎的事情了。下方就是Client調(diào)用“小弟”的代碼。下方的測(cè)試用例和上一部分的測(cè)試用例相比簡(jiǎn)單了許多,這就是“外觀模式”的優(yōu)點(diǎn),可以簡(jiǎn)化操作,并且可以將你與你的瑣事之間進(jìn)行解耦。下方就是我們引入“外觀模式”后的測(cè)試用例與該測(cè)試用例的輸出結(jié)果。當(dāng)然,此時(shí)此刻擁有小弟的你仍然可以事必躬親,仍然可以自己去做之前的事情呢,小弟只是幫你簡(jiǎn)化你的操作,至于你使用還是不使用他就在那。
? ?
?
至此我們的“外觀模式”就介紹完了,用大白話說(shuō),“外觀模式”就是你的“小弟”,扯淡點(diǎn)將,你可以將外觀模式看做是你的“小弟模式”,它可以簡(jiǎn)化接口的調(diào)用。本篇博客中的代碼實(shí)例仍然會(huì)在Github上進(jìn)行分享。
github分享地址:https://github.com/lizelu/DesignPatterns-Swift
?
轉(zhuǎn)載于:https://www.cnblogs.com/ludashi/p/5417645.html
總結(jié)
以上是生活随笔為你收集整理的设计模式(八): 从“小弟”中来类比外观模式(Facade Pattern)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CDOJ 1070 秋实大哥打
- 下一篇: parseInt(),parseFloa