首页 > 代码库 > 【设计模式】外观模式

【设计模式】外观模式

 

 

/************************************************************************
设计模式
外观模式

外观模式:有若干子系统,这些子系统提供提供了若干功能,如果要完成某个操作,
需要由各个子系统的全部或若干功能组成,那就需要类似的代码:

class Subsystem1
{
    void function1_1();
    void function1_2();
}

class Subsystem2
{
    void function2_1();
    void function2_2();
}

calss Subsystem3
{
    void function3_1();
    void functoin3_2();
}

要完成一个操作Operate1,需要如下:

    操作1:Operate1  
    function1_1();
    function3_2();
 

等等, 所以当有若干个操作和若干个排列组合时,就需要在客户度写多次,当有
子系统扩展和函数名更改时,就需要在每次用到的地方全部更改;这样耦合度极高,
这时就可以使用【外观模式】

外观模式提供了一系列接口,在这些接口内部对各个子系统的功能进行了排列组合的
调用,客户端在使用时直接使用外观模式提供的接口接口,客户端并不知道外观模式
内部封装了哪些操作,各个子系统也不知道外观类的存在,外观类需要了解各个子系统
的很多细节。

感觉外观模式和代理模式有点像呢?
************************************************************************/


/************************************************************************
这里我们以这样一个例子来说明,这也是【大话设计模式】里小菜和大鸟提到的
例子

客户通过基金公司购买基金,基金公司通过专业的操作,包括投资股票等投资项目
完成升值,为客户赚钱,基金公司赚取管理费。
这里的基金公司就是一个外观类,其赚钱的手段封装了很多细节的操作,对客户
来说,他只通过基金公司打交道来来购买 / 赎回自己的钱。

************************************************************************/

 

 

 

 

三个类,【股票】类 和 【投资】类相当于两个基金组织可以操作的两个子系统,【基金】类相当于【外观】,其内部的收入(Shouru()) 和 支出(Zhichu())操作封装了【股票】类和【投资】类的操作。

客户并不知道基金组织怎么用钱,对客户来说只有【基金】类提供给他的收入和之处接口。

【股票】类 和 【外观】类也并不知道有【基金】类的存在。

//【股票】类
class CStock
{
public:
    CStock();
    virtual ~CStock();
    void Buy();   //
    void Sell();  //
};

CStock::CStock(){cout << "进入股票市场"<<endl;}
CStock::~CStock(){}
void CStock::Buy(){cout << "买入股票"<<endl;}
void CStock::Sell(){cout << "卖出股票"<<endl;}


//【投资】类
class CInvest
{
public: 
    CInvest();
    virtual ~CInvest();
    void Invest();    //投资
    void Benifite();  //获利 
};

CInvest::CInvest(){cout << "进行资本市场"<<endl;}
CInvest::~CInvest(){}
void CInvest::Invest(){cout << "进行投资"<<endl;}
void CInvest::Benifite(){cout<< "投资获利"<<endl;}



//【基金】类,即外观类
class CFund 
{
public:
    CFund();
    virtual ~CFund();
    void Zhichu();
    void Shouru();

CStock* m_ptrStock;
CInvest* m_ptrInvest;
};

CFund::CFund()
{
    cout<<"基金组织开始运作:"<<endl; 
    m_ptrStock = new CStock();
    m_ptrInvest = new CInvest();
    cout << endl;
}


CFund::~CFund(){}
void CFund::Zhichu()
{    
    cout << "支出操作:"<<endl;
    m_ptrStock->Buy();
    m_ptrInvest->Invest();
    cout<<endl<<endl;
}
void CFund::Shouru()
{
    cout << "收入操作:"<<endl; 
    m_ptrStock->Sell();
    m_ptrInvest->Benifite();
    cout<<endl;
}

 

 

 

 

客户端代码

int _tmain(int argc, _TCHAR* argv[])
{
    CFund* pFunc = new CFund();
    pFunc->Zhichu();
    pFunc->Shouru();


    return 0;
}

 

 

 

执行结果: