設計模式淺析(八) ·外觀模式
日常叨逼叨
java設計模式淺析,如果覺得對你有幫助,記得一鍵三連,謝謝各位觀眾老爺😁😁
外觀模式
概念
外觀模式(Facade Pattern)是一種設計模式,它為子系統中的一組接口提供一個統一的高層接口,使得子系統更加容易使用。這種設計模式的主要目的是降低系統的復雜性,簡化客戶端與子系統之間的交互。
外觀(Facade)模式是“迪米特法則”的典型應用。
迪米特法則:又叫作最少知識原則(The Least Knowledge Principle),一個類對于其他類知道的越少越好,就是說一個對象應當對其他對象有盡可能少的了解,只和朋友通信,不和陌生人說話。英文簡寫為: LOD。
組成
- 外觀類(Facade):這是外觀模式的核心。外觀類為客戶端提供了一個簡潔的接口,用于訪問子系統中的功能。外觀類內部通常包含了對子系統多個組件的引用,并且提供了高層次的方法來調用這些組件。客戶端不需要直接與子系統組件交互,而是通過外觀類來間接訪問它們。
- 子系統組件(Subsystem Components):這些是子系統中實際執行操作的類。它們實現了具體的功能,但通常對于客戶端來說是不可見的。外觀類負責協調這些組件的工作,并將結果呈現給客戶端。
- 客戶端(Client):客戶端是使用外觀模式的代碼部分。它只需要與外觀類交互,而不需要了解子系統的具體實現細節。客戶端通過調用外觀類提供的方法,可以間接地使用子系統提供的功能。
案例
我就以自己家里的一些家電為例子,比如我家有電燈,空調,電視這三種家電,然后呢他們都有自己獨立的開關,我如果我想要讓它們都處于工作狀態,我得一件一件地去打開他們的開關,但是呢,我個人比較懶,想著能不能接入一個小雷同學,讓它去負責各個家電,我只需要操作小雷同學就可以?
說干就干,首先是我家里的各個電器
//空調
public class AirCondition {public void on() {System.out.println("打開了空調....");}public void off() {System.out.println("關閉了空調....");}
}
//電視機
public class TV {public void on() {System.out.println("打開了電視....");}public void off() {System.out.println("關閉了電視....");}
}
//燈
public class Light {public void on() {System.out.println("打開了燈....");}public void off() {System.out.println("關閉了燈....");}
}
然后呢,我接入一個小雷同學
//智能音箱
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;//other household appliancepublic SmartAppliancesFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}public void say(String message) {if (message.contains("開燈")) {onLamp();} else if (message.contains("關燈")) {offLamp();} else if (message.contains("開電視")) {onTV();} else if (message.contains("關電視")) {offTV();} else if (message.contains("開空調")) {onAirCondition();} else if (message.contains("關空調")) {offAirCondition();} else if (message.contains("打開家電")) {onLamp();onTV();onAirCondition();//on other household appliance} else if (message.contains("關閉家電")) {offLamp();offTV();offAirCondition();//off other household appliance} else {System.out.println("我還聽不懂你說的!!!");}}private void onLamp() {light.on();}private void offLamp() {light.off();}private void onTV() {tv.on();}private void offTV() {tv.off();}private void onAirCondition() {airCondition.on();}private void offAirCondition() {airCondition.off();}
}
而對于我來說,我只需要知道小雷同學,而不需要知道各個家電。
public class Client {public static void main(String[] args) {//創建外觀對象SmartAppliancesFacade facade = new SmartAppliancesFacade();//客戶端直接與外觀對象進行交互facade.say("小雷同學,請打開家電");
// facade.say("關閉家電");}
}
執行結果:
打開了燈…
打開了電視…
打開了空調…
這樣,對于客戶端來說,可以通過一個智能音箱控制全部,而不用管其他的具體實現,只要知道這個接口即可以了。
但是在一些具體的示例中,外觀模式的使用可能有所差異,望各位看官老爺們斟酌使用。
優缺點
外觀模式的主要優點包括:
- 簡化了客戶端的使用:客戶端只需要與外觀類交互,而不需要了解子系統的復雜性。
- 降低了系統的耦合度:外觀類將客戶端與子系統解耦,減少了它們之間的直接依賴。
- 提供了統一的接口:外觀類為子系統提供了一個統一的接口,使得子系統更加容易集成和擴展。
然而,外觀模式也有一些潛在的缺點,比如:
- 過度集中化:如果外觀類承擔了太多的責任,它可能會變得過于復雜和難以維護。
- 不適合所有場景:對于某些系統來說,外觀模式可能并不是最合適的設計選擇。如果子系統非常簡單,或者客戶端需要直接訪問子系統組件,那么外觀模式可能并不適用。
代碼相關代碼可以參考 代碼倉庫🌐
ps:本文原創,轉載請注明出處