一. 舉例說明
還以我以前做的文件系統(FileSys)為例:
文件系統是一個獨立的系統,它提供一套核心的文件操作。
除了文件系統,還有四個子系統,分別是殺毒子系統(KillVirus),壓縮子系統(ZipFile),加密子系統(EncrypeFile)和刻錄子系統(BurnCD),這四個子系統相互獨立,但又可以做為主系統功能的一部分。
假設客戶需要我這個文件系統有兩種執行模式,一種是完全模式,一種是簡單模式。
完全模式,要求殺毒子,壓縮,加密和刻錄功能都有。
簡單模式,要求只要有殺毒,刻錄就行了。
第一種設計:
文件系統自己管理所有的子系統,並實現客戶的需求。
最開始的話,我們是按上面的結構來設計的,這個文件系統(FileSys)就要自己管理和組織上面的四個子系統。問題是子系統變化比較多,特別是重構之後,接口也變了,這時也要相應的修改這個文件系統。最麻煩的是,有時一個子系統要分離出好多小類,這對子系統是好事,但是對FileSys來說,調用越來越復雜和困難了。
這種設計的問題是:文件系統和子系統耦合性太高了!
第二種設計:
後來我們獨立出一個中間層,由中間層來統一管理這些子系統,並對外提供相對簡單的接口,使它們之間減少依賴。
代碼實現:
[cpp] view plaincopyprint?//殺毒
class KillVirus
{
public:
void Operation1() { cout<<"殺毒"<<endl; }
};
//壓縮
class ZipFile
{
public:
void Operation2() { cout<<"壓縮"<<endl; }
};
//加密
class EncryptFile
{
public:
void Operation3() { cout<<"加密"<<endl; }
};
//刻錄
class BurnCD
{
public:
void Operation4() { cout<<"刻錄"<<endl;}
};
//高層接口
class OperatorWapper
{
public:
//完全功能
void MethodA()
{
KillVirus kill;
ZipFile zip;
EncryptFile encrypt;
BurnCD burn;
kill.Operation1();
zip.Operation2();
encrypt.Operation3();
burn.Operation4();
}
//簡單功能
void MethodB()
{
KillVirus kill;
BurnCD burn;
kill.Operation1();
burn.Operation4();
}
};
//測試代碼
int main()
{
OperatorWapper op;
op.MethodA();//完全功能
op.MethodB();//簡單功能
return 0;
}
//殺毒
class KillVirus
{
public:
void Operation1() { cout<<"殺毒"<<endl; }
};
//壓縮
class ZipFile
{
public:
void Operation2() { cout<<"壓縮"<<endl; }
};
//加密
class EncryptFile
{
public:
void Operation3() { cout<<"加密"<<endl; }
};
//刻錄
class BurnCD
{
public:
void Operation4() { cout<<"刻錄"<<endl;}
};
//高層接口
class OperatorWapper
{
public:
//完全功能
void MethodA()
{
KillVirus kill;
ZipFile zip;
EncryptFile encrypt;
BurnCD burn;
kill.Operation1();
zip.Operation2();
encrypt.Operation3();
burn.Operation4();
}
//簡單功能
void MethodB()
{
KillVirus kill;
BurnCD burn;
kill.Operation1();
burn.Operation4();
}
};
//測試代碼
int main()
{
OperatorWapper op;
op.MethodA();//完全功能
op.MethodB();//簡單功能
return 0;
}
二. 外觀模式
定義:為子系統中的一組接口提供一個一致的界面, 外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
簡單的說,就是分層的概念。
說明:
1. 在設計初期,應該有意識的將不同層分離,比如常用的三層架構,就是考慮在數據訪問層,業務邏輯層與表示層之間,建立Facade,使復雜的子系統提供一個簡單的接口,降低耦合性。
2. 在開發階段,子系統往往因為不斷的重構而變的越來越復雜,增加外觀Facade可以提供一個簡單的接口,減少它們之間的依賴。
3. 在維護階段,可能這個系統已經非常難以維護和擴展了,此時你可以為新系統開發一個外觀類,來提供設計粗糙或高度復雜的遺留代碼的比較清晰簡單的接口,讓新系統與Facade對象交互,Facade與遺留代碼交互所有復雜的工作。
作者 lwbeyond