三分鐘學會門面模式!

前言

只有光頭才能變強html

回顧前面所寫過的設計模式:git

不管是面試仍是我的的提高,設計模式是必學的。今天來說解門面(外觀)模式~ide

上一次分享了一篇好文:《爲何阿里巴巴禁止工程師直接使用日誌系統(Log4j、Logback)中的 APIui

【強制】應用中不可直接使用日誌系統(Log4j、Logback)中的 API,而應依賴使用日誌框架SLF4J 中的 API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一spa

不知道你們有沒有了解過門面模式,我去翻了一下《設計模式之禪》,發現很是簡單,因此在這給你們分享一下。

1、門面(外觀)模式介紹

1.1門面模式現實例子

一個電源總開關能夠控制全部電器的打開或關閉狀態。

image.png

不管是空調、冰箱、電視、電腦、風扇等等,只要是電器都受這個電閘控制。只要這個電閘將關閉,全部的電器都會受到牽連(一同關閉)。

電源總開關(電閘)即爲該系統的外觀模式設計。

1.2回到代碼世界

好比,咱們家裏如今有空調、冰箱、電腦這麼幾個電器

 
 
  1. // 冰箱

  2. public class Fridge {


  3.    // 關閉冰箱

  4.    public void turnOff() {


  5.    }


  6.    // 開冰箱燈..減低冰箱溫度..調高冰箱溫度...

  7. }



  8. // 電視

  9. public class Television {



  10.    // 關閉電視

  11.    public void turnOffTV() {

  12.        System.out.println("關閉電視");

  13.    }


  14.    // 切換電視節目..減低電視聲音..調高電視聲音...

  15.    public void doSomething() {

  16.        System.out.println("切換電視節目..減低電視聲音..調高電視聲音...");

  17.    }

  18. }


  19. // 電腦

  20. public class Computer {

  21.    // 關閉電腦

  22.    public void turnOffComputer() {

  23.        System.out.println("關閉電腦");

  24.    }


  25.    // 使用電腦幹別的事~

  26.    public void doSomething() {

  27.        System.out.println("使用電腦幹別的事~");

  28.    }


  29. }

若是沒有電閘的的狀況下,我想將上面的電器關閉掉,我須要這樣幹:

 
 
  1.    // 我要關閉電視、電腦、空調

  2.    public static void main(String[] args) {

  3.        new Computer().turnOffComputer();

  4.        new Fridge().turnOffFridge();

  5.        new Television().turnOffTV();


  6.        // 固然了,一個正常的家庭不僅僅只有這麼點電器的。

  7.        // 若是某一天我想關閉家裏全部的電器,就須要重複new 個對象,調用其turn offer方法

  8.    }

一個一個關是否是很麻煩,因此咱們就有了電閘:

 
 
  1. // 電閘

  2. public class ElectricBrake {

  3.    private Computer computer = new Computer();

  4.    private Fridge fridge = new Fridge();

  5.    private Television television = new Television();


  6.    // 關閉全部電器

  7.    public void turnOffAll() {

  8.        computer.turnOffComputer();

  9.        fridge.turnOffFridge();

  10.        television.turnOffTV();

  11.    }

  12. }

當咱們想關閉全部電器的時候,咱們能夠使用電閘來關閉。

    // 我要關閉全部電器    public static void main(String[] args) {        ElectricBrake brake = new ElectricBrake();        brake.turnOffAll();    }

有經驗的同窗可能就會想,這不就再封裝了一層嗎??這就是門面模式啦??嗯,沒錯,這就是門面模式

1.3門面模式介紹

《設計模式之禪》:

要求一個子系統的外部與其內部的通訊必須經過一個統一的對象進行。門面模式提供一個高層次的接口,使得子系統更易於使用。

門面模式的通用類圖十分簡單:

image.png

按照咱們的例子,子系統就至關於電腦、冰箱、電視。統一的對象就至關於咱們的電閘。咱們經過電閘來對全部電器進行關閉(使得不用逐個逐個找電腦、冰箱、電視來關閉)

image.png

使用了門面模式,使客戶端調用變得更加簡單

image.png

1.4門面模式的優缺點

優勢:

  1. 減小系統的相互依賴。使用門面模式,全部的依賴都是對門面對象的依賴,與子系統無關

  2. 提升了靈活性。無論子系統內部如何變化,只要不影響門面對象,任你自由活動。

缺點:

  1. 不符合開閉原則,對修改關閉,對擴展開放。好比咱們上面的例子,若是有新電器要想要加入一次關閉的隊伍中,只能在門面對象上修改 turnOffAll()方法的代碼。

最後

是否是以爲門面設計模式就那麼一回事了?說白了就是對子系統封裝了一層,給予了一個高層次的接口(門面對象),進而方便客戶端調用。

推薦閱讀和參考資料:

  • 《設計模式之禪》

  • https://blog.csdn.net/hguisu/article/details/7533759

  • https://www.cnblogs.com/lthIU/p/5860607.html

樂於分享和輸出乾貨的Java技術公衆號:Java3y。

image.png

文章的目錄導航

  • https://github.com/ZhongFuCheng3y/3y

相關文章
相關標籤/搜索