只有光頭才能變強html
回顧前面所寫過的設計模式:java
給女友講解什麼是代理模式git
包裝模式就是這麼簡單啦github
工廠模式理解了沒有?設計模式
不管是面試仍是我的的提高,設計模式是必學的。今天來說解門面(外觀)模式~ui
上一次分享了一篇好文:《爲何阿里巴巴禁止工程師直接使用日誌系統(Log4j、Logback)中的 API》.net
【強制】應用中不可直接使用日誌系統(Log4j、Logback)中的 API,而應依賴使用日誌框架SLF4J 中的 API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。設計
不知道你們有沒有了解過門面模式,我去翻了一下《設計模式之禪》,發現很是簡單,因此在這給你們分享一下。
一個電源總開關能夠控制全部電器的打開或關閉狀態。
不管是空調、冰箱、電視、電腦、風扇等等,只要是電器都受這個電閘控制。只要這個電閘將關閉,全部的電器都會受到牽連(一同關閉)。
電源總開關(電閘)即爲該系統的外觀模式設計。
好比,咱們家裏如今有空調、冰箱、電腦這麼幾個電器
// 冰箱 public class Fridge { // 關閉冰箱 public void turnOff() { } // 開冰箱燈..減低冰箱溫度..調高冰箱溫度... } // 電視 public class Television { // 關閉電視 public void turnOffTV() { System.out.println("關閉電視"); } // 切換電視節目..減低電視聲音..調高電視聲音... public void doSomething() { System.out.println("切換電視節目..減低電視聲音..調高電視聲音..."); } } // 電腦 public class Computer { // 關閉電腦 public void turnOffComputer() { System.out.println("關閉電腦"); } // 使用電腦幹別的事~ public void doSomething() { System.out.println("使用電腦幹別的事~"); } }
若是沒有電閘的的狀況下,我想將上面的電器關閉掉,我須要這樣幹:
// 我要關閉電視、電腦、空調 public static void main(String[] args) { new Computer().turnOffComputer(); new Fridge().turnOffFridge(); new Television().turnOffTV(); // 固然了,一個正常的家庭不僅僅只有這麼點電器的。 // 若是某一天我想關閉家裏全部的電器,就須要重複new 個對象,調用其turn offer方法 }
一個一個關是否是很麻煩,因此咱們就有了電閘:
// 電閘 public class ElectricBrake { private Computer computer = new Computer(); private Fridge fridge = new Fridge(); private Television television = new Television(); // 關閉全部電器 public void turnOffAll() { computer.turnOffComputer(); fridge.turnOffFridge(); television.turnOffTV(); } }
當咱們想關閉全部電器的時候,咱們可使用電閘來關閉。
// 我要關閉全部電器 public static void main(String[] args) { ElectricBrake brake = new ElectricBrake(); brake.turnOffAll(); }
有經驗的同窗可能就會想,這不就再封裝了一層嗎??這就是門面模式啦??嗯,沒錯,這就是門面模式
《設計模式之禪》:
要求一個子系統的外部與其內部的通訊必須經過一個統一的對象進行。門面模式提供一個高層次的接口,使得子系統更易於使用。
門面模式的通用類圖十分簡單:
按照咱們的例子,子系統就至關於電腦、冰箱、電視。統一的對象就至關於咱們的電閘。咱們經過電閘來對全部電器進行關閉(使得不用逐個逐個找電腦、冰箱、電視來關閉)
使用了門面模式,使客戶端調用變得更加簡單!
優勢:
減小系統的相互依賴。使用門面模式,全部的依賴都是對門面對象的依賴,與子系統無關
提升了靈活性。無論子系統內部如何變化,只要不影響門面對象,任你自由活動。
缺點:
turnOffAll()
方法的代碼。是否是以爲門面設計模式就那麼一回事了?說白了就是對子系統封裝了一層,給予了一個高層次的接口(門面對象),進而方便客戶端調用。
推薦閱讀和參考資料:
《設計模式之禪》
樂於分享和輸出乾貨的Java技術公衆號:Java3y。關注便可領取海量的視頻資源!
文本已收錄至個人GitHub倉庫,歡迎Star: