設(shè)計(jì)模式:外觀模式(Facade模式)
Facade(外觀)模式為子系統(tǒng)中的各類(或結(jié)構(gòu)與方法)提供一個(gè)簡明一致的界面,隱藏子系統(tǒng)的復(fù)雜性,使子系統(tǒng)更加容易使用
當(dāng)一個(gè)系統(tǒng)的功能越來越強(qiáng),子系統(tǒng)會越來越多,客戶對系統(tǒng)的訪問也變得越來越復(fù)雜。所以有必要為多個(gè)子系統(tǒng)提供一個(gè)統(tǒng)一的接口,從而降低系統(tǒng)的耦合度

外觀(Facade)模式是“迪米特法則”的典型應(yīng)用,它有以下主要優(yōu)點(diǎn)。
降低了子系統(tǒng)與客戶端之間的耦合度,使得子系統(tǒng)的變化不會影響調(diào)用它的客戶類。
對客戶屏蔽了子系統(tǒng)組件,減少了客戶處理的對象數(shù)目,并使得子系統(tǒng)使用起來更加容易。
降低了大型軟件系統(tǒng)中的編譯依賴性,簡化了系統(tǒng)在不同平臺之間的移植過程,因?yàn)榫幾g一個(gè)子系統(tǒng)不會影響其他的子系統(tǒng),也不會影響外觀對象。
外觀(Facade)模式的主要缺點(diǎn)如下。
不能很好地限制客戶使用子系統(tǒng)類,很容易帶來未知風(fēng)險(xiǎn)。
增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
外觀(Facade)模式的結(jié)構(gòu)比較簡單,主要是定義了一個(gè)高層接口。它包含了對各個(gè)子系統(tǒng)的引用,客戶端可以通過它訪問各個(gè)子系統(tǒng)的功能?,F(xiàn)在來分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法。
1. 模式的結(jié)構(gòu)
外觀(Facade)模式包含以下主要角色。
外觀(Facade)角色:為多個(gè)子系統(tǒng)對外提供一個(gè)共同的接口。
子系統(tǒng)(Sub System)角色:實(shí)現(xiàn)系統(tǒng)的部分功能,客戶可以通過外觀角色訪問它。
客戶(Client)角色:通過一個(gè)外觀角色訪問各個(gè)子系統(tǒng)的功能
實(shí)現(xiàn)代碼:(純手打,如果有錯(cuò)誤應(yīng)該問題不大)
首先定義外觀角色:
class Facade{
????private SubSystem1 obj1 = new?SubSystem1();//對子系統(tǒng)1的引用
private?SubSystem2?obj2?= new?SubSystem2();//對子系統(tǒng)2的引用
private?SubSystem3?obj3?= new?SubSystem3();//對子系統(tǒng)3的引用
/**
/*提供訪問子系統(tǒng)功能的接口
*/
public useSys1(){
????obj1.used();
}
public useallSys(){
????obj1.used();
obj2.used();
obj3.used();
}
}
//定義子系統(tǒng)角色
class System1{
used(){
console.log("子系統(tǒng)1的used功能"被調(diào)用);
}
}
class System2{
used(){
console.log("子系統(tǒng)2的used功能"被調(diào)用);
}
}
class System3{
used(){
console.log("子系統(tǒng)3的used功能"被調(diào)用);
}
}
//提供客戶角色通過外觀模式訪問各子系統(tǒng)的功能
class Client1{
????private f:Facade = null;
????constructor(){
????f = new Facade();
}
//調(diào)用方法
usesystem1(){
f.useSys1();
}
}
facade可以通過繼承方式擴(kuò)展,以上代碼為界面純手打,可能有錯(cuò)誤,但邏輯應(yīng)該是對的