前言
只有光頭才能變強
回顧前面所寫過的設計模式:
無論是面試還是個人的提升,設計模式是必學的。今天來講解門面(外觀)模式~
上一次分享了一篇好文:《為什麼阿里巴巴禁止工程師直接使用日誌系統(Log4j、Logback)中的 API》
【強制】應用中不可直接使用日誌系統(Log4j、Logback)中的 API,而應依賴使用日誌框架SLF4J 中的 API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。
不知道大家有沒有了解過門面模式,我去翻了一下《設計模式之禪》,發現非常簡單,所以在這給大家分享一下。
一、門面(外觀)模式介紹
1.1門面模式現例項子
一個電源總開關可以控制所有電器的開啟或關閉狀態。
無論是空調、冰箱、電視、電腦、風扇等等,只要是電器都受這個電閘控制。只要這個電閘將關閉,所有的電器都會受到牽連(一同關閉)。
電源總開關(電閘)即為該系統的外觀模式設計。
1.2回到程式碼世界
比如,我們家裡現在有空調、冰箱、電腦這麼幾個電器
// 冰箱
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();
}
複製程式碼
有經驗的同學可能就會想,這不就再封裝了一層嗎??這就是門面模式啦??嗯,沒錯,這就是門面模式
1.3門面模式介紹
《設計模式之禪》:
要求一個子系統的外部與其內部的通訊必須通過一個統一的物件進行。門面模式提供一個高層次的介面,使得子系統更易於使用。
門面模式的通用類圖十分簡單:
按照我們的例子,子系統就相當於電腦、冰箱、電視。統一的物件就相當於我們的電閘。我們通過電閘來對所有電器進行關閉(使得不用逐個逐個找電腦、冰箱、電視來關閉)
使用了門面模式,使客戶端呼叫變得更加簡單!
1.4門面模式的優缺點
優點:
-
減少系統的相互依賴。使用門面模式,所有的依賴都是對門面物件的依賴,與子系統無關
-
提高了靈活性。不管子系統內部如何變化,只要不影響門面物件,任你自由活動。
缺點:
- 不符合開閉原則,對修改關閉,對擴充套件開放。比如我們上面的例子,如果有新電器要想要加入一次關閉的隊伍中,只能在門面物件上修改
turnOffAll()
方法的程式碼。
最後
是不是覺得門面設計模式就那麼一回事了?說白了就是對子系統封裝了一層,給予了一個高層次的介面(門面物件),進而方便客戶端呼叫。
推薦閱讀和參考資料:
樂於分享和輸出乾貨的Java技術公眾號:Java3y。關注即可領取海量的視訊資源!
文字已收錄至我的GitHub倉庫,歡迎Star: