標籤:style blog http color 使用 strong
面板模式(Facade),為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
面板模式結構圖:
代碼模板:
//四個子系統的類
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 Facade
{
private:
SubSystemOne *one;
SubSystemTwo *two;
SubSystemThree *three;
SubSystemFour *four;
public:
Facade()
{
one = new SubSystemOne();
two = new SubSystemTwo();
three = new SubSystemThree();
four = new SubSystemFour();
}
void MethodA()
{
cout << "方法組A()---" << endl;
one->MethodOne();
two->MethodTwo();
four->MethodFour();
}
void MethodB()
{
cout << "方法組B()---" << endl;
two->MethodTwo();
three->MethodThree();
}
};
//用戶端調用,由於Facede的作用,用戶端可以根本不知道子系統類的存在
int main()
{
Facade *facade=new Facade();
facade->MethodA();
facade->MethodB();
return 0;
}
下面舉個買賣股票的例子:
代碼結構圖:
class Stock1{public: void Sell() { cout << "股票1賣出" << endl; } void Buy() { cout << "股票1買入" << endl; }};class Stock2{public: void Sell() { cout << "股票2賣出" << endl; } void Buy() { cout << "股票2買入" << endl; }};class Stock3{public: void Sell() { cout << "股票3賣出" << endl; } void Buy() { cout << "股票3買入" << endl; }};class NationalDebt1{public: void Sell() { cout << "國債1賣出" << endl; } void Buy() { cout << "國債1買入" << endl; }};class Realty1{public: void Sell() { cout << "房地產1賣出" << endl; } void Buy() { cout << "房地產1買入" << endl; }};//外觀class Fund{private: Stock1 *gu1; Stock2 *gu2; Stock3 *gu3; NationalDebt1 *nd1; Realty1 *rt1;public: Fund() { gu1=new Stock1(); gu2=new Stock2(); gu3=new Stock3(); nd1=new NationalDebt1(); rt1=new Realty1(); } void BuyFund() { gu1->Buy(); gu2->Buy(); gu3->Buy(); nd1->Buy(); rt1->Buy(); } void SellFund() { gu1->Sell(); gu2->Sell(); gu3->Sell(); nd1->Sell(); rt1->Sell(); }};int main(){ Fund *jijin=new Fund(); jijin->BuyFund(); jijin->SellFund(); return 0;}
面板模式使用的時機,我們要從三個階段來說,首先,在設計初期,應該要有意識的將不同的兩個層分離,比如經典的三層架構,就需要考慮在資料訪問層和商務邏輯層、商務邏輯層和展示層的層與層之間建立外觀Facade,這樣可以為複雜的子系統提供一個簡單的介面,使得耦合大大降低。其次,在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜,大多數的模式使用時也都會產生很多很小的類,這本是好事,但也給外部調用他們的使用者程式帶來了使用上的困難,增加面板模式可以提供一個簡單的介面,減少他們之間的依賴。第三,在維護一個遺留的大型系統時,可能這個系統已經非常難以維護和擴充了,但因為它包含非常重要的功能,新的需求開發必須要依賴它。此時面板模式也是非常合適的。你可以為新系統開發一個Facade類,來提供設計粗糙或高度複雜的遺留代碼的比較清晰簡單的介面,讓新系統與Facade對象互動,Facade與遺留代碼互動所有複雜的工作。