介紹
現(xiàn)實(shí)生活中有許多外觀模式的例子袄秩,像餐館的服務(wù)員现柠、一些企業(yè)的客戶(hù)人員、公司的前臺(tái)等等豆赏。
外觀模式(Facade Pattern)隱藏系統(tǒng)的復(fù)雜性挣菲,并向客戶(hù)端提供了一個(gè)客戶(hù)端可以訪問(wèn)系統(tǒng)的接口富稻。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它向現(xiàn)有的系統(tǒng)添加一個(gè)接口白胀,來(lái)隱藏系統(tǒng)的復(fù)雜性椭赋。
這種模式涉及到一個(gè)單一的類(lèi),該類(lèi)提供了客戶(hù)端請(qǐng)求的簡(jiǎn)化方法和對(duì)現(xiàn)有系統(tǒng)類(lèi)方法的委托調(diào)用或杠。
為什么要使用外觀模式哪怔?
讓外部不直接與內(nèi)部進(jìn)行交互,降低訪問(wèn)復(fù)雜系統(tǒng)的內(nèi)部子系統(tǒng)時(shí)的復(fù)雜度向抢,簡(jiǎn)化客戶(hù)端與之的接口认境。就像餐館一樣,你只需要知道菜的名字挟鸠,而不需要知道菜是如何做的叉信。
為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,外觀模式定義了一個(gè)高層接口艘希,這個(gè)接口使得這一子系統(tǒng)更加容易使用硼身。
外觀模式的優(yōu)點(diǎn):
- 減少系統(tǒng)相互依賴(lài)。
- 提高靈活性覆享。
- 提高了安全性佳遂。
- 松耦合關(guān)系。
實(shí)際應(yīng)用
就比如系統(tǒng)中的登入功能撒顿,當(dāng)你登入時(shí)可以選擇不同的登入方式丑罪,例如微信登入、QQ登入凤壁、手機(jī)號(hào)登入吩屹、郵箱登入等等。
中間的登入就是外觀模式的核心(Facade)客扎,它來(lái)區(qū)分用戶(hù)(client)選擇的是哪種登入祟峦,然后分發(fā)給不同的控制器(子系統(tǒng)角色Subsystem classes)
代碼實(shí)現(xiàn)
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: 手機(jī)號(hào)登入</p>
*/
private static void phoneLogin(){
System.out.println("手機(jī)號(hào)登入...");
}
/**
* <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);
}
}
代碼見(jiàn)github地址
總結(jié)
上面的代碼只是為了方便才把各個(gè)登入方式放在一個(gè)類(lèi)中罚斗,實(shí)際開(kāi)發(fā)中一般會(huì)變成好幾個(gè)services徙鱼,如果博主理解錯(cuò)了,希望你們批評(píng)指正针姿,謝謝袱吆。
從設(shè)計(jì)模式上來(lái)看,外觀模式通過(guò)引入一個(gè)新的外觀類(lèi)可以降低原有系統(tǒng)的復(fù)雜度距淫,外觀類(lèi)充當(dāng)了客戶(hù)類(lèi)與子系統(tǒng)類(lèi)之間的“第三者”绞绒,同時(shí)降低客戶(hù)類(lèi)與子系統(tǒng)類(lèi)的耦合度。但是外觀模式最大的缺點(diǎn)在于違背了“開(kāi)閉原則”榕暇,當(dāng)增加新的子系統(tǒng)或者移除子系統(tǒng)時(shí)需要修改外觀類(lèi)蓬衡,可以通過(guò)引入抽象外觀類(lèi)在一定程度上解決該問(wèn)題喻杈,客戶(hù)端針對(duì)抽象外觀類(lèi)進(jìn)行編程。
所以不要因?yàn)橐迷O(shè)計(jì)模式而用設(shè)計(jì)模式狰晚,適用的才是最好的筒饰。