公號:碼農充電站pro
主頁:https://codeshellme.github.iohtml
今天來介紹外觀模式(Facade Design Pattern)。java
外觀模式又叫門面模式,它提供了一個統一的(高層)接口,用來訪問子系統中的一羣接口,使得子系統更容易使用。git
外觀模式的類圖以下:github
Facede 簡化了原來的很是複雜的子系統,使得子系統更易使用,Client 只需依賴 Facede 便可。算法
雖然有了 Facede ,但 Facede 並影響原來的子系統,也就是其它客戶依然能夠使用原有系統。shell
最少知識原則告訴咱們,應該儘可能減小對象之間的交互,只與本身最須要的接口創建關係。this
在設計系統時,不該該讓太多的類耦合在一塊兒,以避免一小部分的改動,而影響到整個系統的使用。設計
這也就是咱們俗話說的:牽一髮而動全身,最少知識原則的就是讓咱們避免這種狀況的發生。code
外觀模式則使用了最少知識原則。htm
下面舉一個簡單的例子,來體會下外觀模式的使用。俗話說:民以食爲天。咱們來舉一個吃飯的例子。
話說,小明每次吃飯都要通過如下步驟:
可見小明吃一頓飯真的很麻煩。
咱們用代碼來模擬上面的過程,首先建立了三個類,分別是關於菜,飯,碗的操做:
class Vegetables { public void bugVegetables() { System.out.println("buying vegetables."); } public void washVegetables() { System.out.println("washing vegetables."); } public void fryVegetables() { System.out.println("frying vegetables."); } public void toBowl() { System.out.println("putting the vegetables into the bowl."); } } class Rice { public void fryRice() { System.out.println("frying rice."); } public void toBowl() { System.out.println("putting the rice into the bowl."); } } class Bowl { private Vegetables vegetables; private Rice rice; public Bowl(Vegetables vegetables, Rice rice) { this.vegetables = vegetables; this.rice = rice; } // 盛好飯菜 public void prepare() { vegetables.toBowl(); rice.toBowl(); } public void washBowl() { System.out.println("washing bowl."); } }
小明每次吃飯都須要與上面三個類作交互,並且須要不少步驟,以下:
Vegetables v = new Vegetables(); v.bugVegetables(); v.washVegetables(); v.fryVegetables(); Rice r = new Rice(); r.fryRice(); Bowl b = new Bowl(v, r); b.prepare(); System.out.println("xiao ming is having a meal."); b.washBowl();
後來,小明請了一位保姆,來幫他作飯洗碗等。因此咱們建立了 Nanny
類:
class Nanny { private Vegetables v; private Rice r; private Bowl b; public Nanny() { v = new Vegetables(); r = new Rice(); b = new Bowl(v, r); } public void prepareMeal() { v.bugVegetables(); v.washVegetables(); v.fryVegetables(); r.fryRice(); b.prepare(); } public void cleanUp() { b.washBowl(); } }
這樣,小明再吃飯的時候就只須要跟保姆說一聲,保姆就幫他作好了全部的事情:
Nanny n = new Nanny(); n.prepareMeal(); System.out.println("xiao ming is having a meal."); n.cleanUp();
這樣大大簡化了小明吃飯的步驟,也節約了不少時間。
我將完整的代碼放在了這裏,供你們參考。
外觀模式主要用於簡化系統的複雜度,爲客戶提供更易使用的接口,減小客戶對複雜系統的依賴。
從外觀模式中咱們也能看到最少知識原則的運用。
(本節完。)
推薦閱讀:
歡迎關注做者公衆號,獲取更多技術乾貨。