年年作品展,歲歲不同樣,鵝黃新綠漣漪泛起思想的火花卻不盡相同,十期的作品展,從13年3月20號開始到完美落幕,時至今日,她已經在我的記憶中成為過去,這朵小小的浪花激起的漣漪漸漸褪去,也許已沒有也許,但那抹如琉璃般的記憶也在這片平靜中漸漸凝成永恒。當再次凝眸十一期的那群孩子,笑意淺淺,心事微瀾。今天是十一期作品展的日子,看到她們多像去年的我,揣測激情與夢想來到這淡紫色蒲公英飛舞的土地。昨天晚上抽空去看了看十一期的作品展彩排,彩排的過程中,有五彩的燈光,有展示作品的大屏幕,投影儀,還有音響,在整個作品展示的過程中,十一期孩子的后勤人員中,有人負責關閉燈光和打開燈光,有人負責打開和關閉投影儀,一個個作品的銜接需要打開和關閉大屏幕,有的作品是音樂類的軟件,這個時候就要控制音量,打開和關閉音響,咦?這一連串的流程怎么會如此熟悉,猛然間,恍惚,這個儼然就是我們大話設計中的外觀模式啊。
外觀模式,為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。首先我們來看一下我們外觀模式的結構圖:
? ? ? ??
依然以我們的上述十一期作品展為例,來看看我們的類圖:
? ? ? ?
畫好了類圖,來看看我們代碼是如何實現的呢?我們先來看看燈光,投影儀,大屏幕,音響的代碼:
? ? ? ??
~~~
using?System;??
namespace?Facade???
{???
????///????
????//?投影儀???
??????
????public?class?Projector???
????{???
????????public?void?OpenProjector()???
????????{???
????????????Console.WriteLine("打開投影儀");???
????????}??
????????public?void?CloseProjector()???
????????{???
????????????Console.WriteLine("關閉投影儀");???
????????}??
??????????
????}??
?????//燈光??
?????public?class?Light???
????{???
????????public?void?OpenLight()???
????????{???
????????????Console.WriteLine("打開燈光");???
????????}??
????????public?void?CloseLight()???
????????{???
????????????Console.WriteLine("關閉燈光");???
????????}???
????}???
???????
????//屏幕??
?????public?class?Screen???
????{???
????????public?void?OpenScreen()???
????????{???
????????????Console.WriteLine("打開屏幕");???
????????}??
????????public?void?CloseScreen()???
????????{???
????????????Console.WriteLine("關閉屏幕");???
????????}???
????}???
????//音響??
?????public?class??Acoustics????
????{???
????????public?void?Acoustics??()???
????????{???
????????????Console.WriteLine("打開音響");???
????????}??
????????public?void?CloseAcoustics??()???
????????{???
????????????Console.WriteLine("關閉音響");???
????????}???
????}???
}??
~~~
外觀類中的代碼:
~~~
???public?class?ProductionFacade???
????{???
??????????
????????///?在外觀類中必須保存有子系統中各個對象???
???????????
????????private?Projector?projector;???
????????private?Light??light;???
????????private?Screen?screen;???
????????private?Acoustics???acoustics;???
??????????
????????public?ProductionFacade()???
????????{???
????????????projector?=?new?Projector();???
????????????light?=?new?Light();???
????????????screen?=?new?Screen();???
????????????acoustics=new?Acoustics();??
?????????????
????????}??
????????///????
????????///?作品開始??
????????///????
????????public?void?OpenProduction()???
????????{???
????????????//先打開燈光??
????????????light.OpenLight();???
????????????//打開投影??
????????????projector.OpenProjector();???
????????????//再打開屏幕???
????????????screen.OpenScreen();???
????????????//再打開音響??
????????????acoustics.OpenAcoustics();???
?????????????
?????????}??
????????///????
????????///?作品結束??
????????///????
????????public?void?CloseProduction()???
????????{???
????????????//關閉燈光??
????????????light.CloseLight();???
????????????//關閉投影??
????????????projector.CloseProjector();???
????????????//關閉屏幕???
????????????screen.CloseScreen();???
????????????//關閉音響??
????????????acoustics.CloseAcoustics();???
?????????????
?????????}??
?????????
????}???
}??
~~~
客戶端的代碼:
~~~
?static?void?Main(string[]?args)???
????????{???
????????????Facade.ProductionFacade?movie?=?new?Facade.ProductionFacade();???
????????????Facade.Projector?projector?=?new?Facade.Projector();??
??????????????????
????????????//首先是觀看作品???
????????????movie.OpenProduction();??
????????????Console.WriteLine();??
???????????????
?????????????
????????????//最后就是關閉作品了???
????????????movie.CloseProduction();??
????????????Console.ReadKey();???
????????}???
~~~
簡單的說,就是外觀模式將一個或者多個類的復雜的操作進行了隱藏,只顯示一個一致的界面供客戶端使用。需要注意的是,外觀模式僅僅是給我們提供了更為直接和容易地操作方式,她并沒有把原來的子系統進行隔離,所以,如果你還需要子系統類的更高層的功能,還是可以使用原來的子系統,這個是外觀模式的一大優點,通過外觀模式可以將子系統的接口上建立一個高層接口,并且將這個高層接口提供給客戶端使用,這樣便開業解除掉客戶端和復雜子系統之間的耦合。
十一期的作品展今天晚上在學府拉開序幕,祝福你們,愿這朵小小的浪花在IT的海洋里激起驚濤駭浪,我的大話設計依然在繼續........