介紹
現實生活中有許多外觀模式的例子,像餐館的服務員、一些企業的客戶人員、公司的前臺等等。
外觀模式(Facade Pattern)隱藏系統的復雜性,并向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬于結構型模式,它向現有的系統添加一個接口,來隱藏系統的復雜性。
這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法的委托調用。
為什么要使用外觀模式?
讓外部不直接與內部進行交互,降低訪問復雜系統的內部子系統時的復雜度,簡化客戶端與之的接口。就像餐館一樣,你只需要知道菜的名字,而不需要知道菜是如何做的。
為子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
外觀模式的優點:
- 減少系統相互依賴。
- 提高靈活性。
- 提高了安全性。
- 松耦合關系。
實際應用
就比如系統中的登入功能,當你登入時可以選擇不同的登入方式,例如微信登入、QQ登入、手機號登入、郵箱登入等等。
這里寫圖片描述
中間的登入就是外觀模式的核心(Facade),它來區分用戶(client)選擇的是哪種登入,然后分發給不同的控制器(子系統角色Subsystem classes)
代碼實現
public class Facade {
private Facade(){}
/**
* <p>Description:微信登入 </p>
*/
private static void weChatLogin(){
System.out.println("微信登入...");
}
/**
* <p>Description: QQ登入</p>
*/
private static void qqLogin(){
System.out.println("QQ登入...");
}
/**
* <p>Description: 手機號登入</p>
*/
private static void phoneLogin(){
System.out.println("手機號登入...");
}
/**
* <p>Description: Email登入</p>
*/
private static void emailLogin(){
System.out.println("Email登入...");
}
/**
* <p>Description: 其他方式登入</p>
*/
private static void otherLogin(){
System.out.println("Email登入...");
}
public static void login(String method){
switch (method) {
case "weChat":
weChatLogin();
break;
case "qq":
qqLogin();
break;
case "phone":
phoneLogin();
break;
case "email":
emailLogin();
break;
default:
otherLogin();
break;
}
}
public static void main(String[] args) {
String method = "weChat";
Facade.login(method);
}
}
代碼見github地址
總結
上面的代碼只是為了方便才把各個登入方式放在一個類中,實際開發中一般會變成好幾個services,如果博主理解錯了,希望你們批評指正,謝謝。
從設計模式上來看,外觀模式通過引入一個新的外觀類可以降低原有系統的復雜度,外觀類充當了客戶類與子系統類之間的“第三者”,同時降低客戶類與子系統類的耦合度。但是外觀模式最大的缺點在于違背了“開閉原則”,當增加新的子系統或者移除子系統時需要修改外觀類,可以通過引入抽象外觀類在一定程度上解決該問題,客戶端針對抽象外觀類進行編程。
所以不要因為要用設計模式而用設計模式,適用的才是最好的。