【設計模式】——面板模式

來源:互聯網
上載者:User

標籤: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與遺留代碼互動所有複雜的工作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.