外觀模式:爲子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
外觀模式(Facede)結構圖:
四個子系統的類:
class SubSystemOne
{
public:
void MethodOne()
{
cout<< “子系統方法一”<<endl;
}
};
class SubSystemTwo
{
public:
void MethodTwo()
{
cout<< “子系統方法二”<<endl;
}
};
class SubSystemThree
{
public:
void MethodThree()
{
cout<< “子系統方法三”<<endl;
}
};
class SubSystemFour
{
public:
void MethodFour
{
cout<< “子系統方法四”<<endl;
}
};
外觀類:
class Façade
{
private:
SubSystemOne one;
SubSystemTwo two;
SubSystemThree three;
SubSystemFour four;
public:
Façade()
{
one = new SubSystemOne();
two = new SubSystemTwo();
three = new SubSystemThree();
four= new SubSystemFour();
}
void MethodA()
{
cout<< “方法組A”<<endl;
one.MethodOne();
two.MethodTwo();
fout.MethodFour();
}
void MethodB()
{
cout<< “方法組B”<<endl;
two.MethodTwo();
three.MethodThree();
}
};
客戶端調用:
int main()
{
Façade façade = new Façade();
façade.MethodA();
façade.MethodB();
}
對於面向對象有一定基礎的朋友,即使沒有聽說過外觀模式,也完全有可能在很多時候使用過它,因爲它完美地體現了依賴倒轉原則和迪米特法則的思想,所以是非常常用的模式之一。
何時使用外觀模式?
這要分三個階段來說,首先,在設計初期階段,應該要有意識的將不同的兩個層分離,比如經典的三層架構,就需要考慮在數據訪問層和業務邏輯層、業務邏輯層和表現層的層與層之間建立外觀模式Façade,就這樣可以爲複雜的子系統提供一個簡單的接口,使得耦合大大降低。其次,在開發階段,子系統往往因爲不斷的重構演化而變得越來越複雜,大多數的模式使用時也都會產生很多的小的類,這本是好事,但也給外部調用它們的用戶程序帶來了使用上的困難,增加外觀Façade可以提供一個簡單的接口,減少它們之間的依賴。第三,在維護一個遺留的大型系統時,可能這個系統已經非常難以維護和擴展了,但因爲它包含非常重要的功能,新的需求開發必須要依賴於它。此時用外觀模式Façade也是非常適合的。你可以爲新系統開發一個外觀Façade類,來提供設計粗糙或高度複雜的遺留代碼的比較清晰簡單的接口,讓新系統與Façade對象交互,Façade與遺留代碼交互所有複雜的工作。