外觀模式(Facade),為子系統(tǒng)中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。
外觀模式中的角色:
- Facade:外觀類,知道哪些子系統(tǒng)類負(fù)責(zé)處理請求,將客戶端的請求代理給適當(dāng)?shù)淖酉到y(tǒng)對象。
- Subsystem:子系統(tǒng)類,可以有一個或者多個子系統(tǒng)。實現(xiàn)子系統(tǒng)的功能,處理外觀類指派的任務(wù),注意子系統(tǒng)類不含有外觀類的引用。
外觀模式的簡單實現(xiàn)
(1)子系統(tǒng)
public class SubSystemOne {
public void methodOne() {
System.out.println("子系統(tǒng)方法1");
}
}
public class SubSystemTwo {
public void methodTwo() {
System.out.println("子系統(tǒng)方法2");
}
}
(2)外觀類
public class Facade {
private SubSystemOne subSystemOne;
private SubSystemTwo subSystemTwo;
public Facade() {
subSystemOne = new SubSystemOne();
subSystemTwo = new SubSystemTwo();
}
public void methodA() {
System.out.println("methodA");
subSystemOne.methodOne();;
subSystemTwo.methodTwo();
}
public void methodB() {
System.out.println("methodB");
subSystemOne.methodOne();;
subSystemTwo.methodTwo();
}
}
(3)客戶端調(diào)用
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.methodA();
facade.methodB();
}
}
(4)輸出
methodA
子系統(tǒng)方法1
子系統(tǒng)方法2
methodB
子系統(tǒng)方法1
子系統(tǒng)方法2
外觀模式的使用場景
使用場景:
構(gòu)建一個有層次結(jié)構(gòu)的子系統(tǒng)時,使用外觀模式定義子系統(tǒng)中每層的入口點。如果子系統(tǒng)之間是相互依賴的,則可以讓其通過外觀接口進(jìn)行通信,減少子系統(tǒng)之間的依賴關(guān)系。
子系統(tǒng)往往會因為不斷重構(gòu)演化而變得越來越復(fù)雜,大多數(shù)的模式使用時也會產(chǎn)生很多很小的類,這給外部調(diào)用它們的用戶程序帶來了使用上的困難。我們可以使用外觀類提供一個簡單的接口,對外隱藏子系統(tǒng)的具體實現(xiàn)并隔離變化。
當(dāng)維護(hù)一個遺留的大型系統(tǒng)時,可能這個系統(tǒng)已經(jīng)非常男以維護(hù)和拓展,但因為它含有重要的功能,所以新的需求必須依賴于它,這時可以使用外觀類,為設(shè)計粗糙或者復(fù)雜的遺留代碼提供一個簡單的接口,讓新系統(tǒng)和外觀類交互,而外觀類負(fù)責(zé)與遺留的代碼進(jìn)行交互。
外觀模式的優(yōu)缺點
優(yōu)點:
減少系統(tǒng)的相互依賴,所有的依賴都是對外觀類的依賴,與子系統(tǒng)無關(guān)。
對用戶隱藏了子系統(tǒng)的具體實現(xiàn),減少用戶對子系統(tǒng)的耦合。這樣即使具體的子系統(tǒng)發(fā)生了變化,用戶也不會感知到。
加強了安全性,子系統(tǒng)中的方法如果不在外觀類中開通,就無法訪問到子系統(tǒng)中的方法。
缺點:
不符合開發(fā)封閉原則。如果業(yè)務(wù)出現(xiàn)變更,則可能要直接修改外觀類。