1.外观模式的定义与类图
外观模式的理解很简单,其就是为一组有类似功能的类群,比如类库、子系统等等,提供一个一致的简单界面(类比于一套外用接口也可以),主要是为了让子系统更容易使用。
具体的类图如下:
由图可见外观模式的类图十分简单粗暴,通过客户端Client调用外观模式Facade的类实现子系统的操作。而外观模式Facade中将各个子系统作为其关联对象(成员变量),在其中建立不同的函数来调用单个或多个子系统来实现对应的操作。这就实现了客户端与实际功能类的分离,两者均通过中间类外观模式Facade来连接,在需要修改/增删功能时能够有效得降低代码工作量。
2.外观模式的代码实现
本例中使用了外观模式实现选择购买股票Share,期货Futures以及债券Bond的三个实现函数,客户端通过调用Facade来实现自己的期望操作。
#include <iostream>
#include <string>
using namespace std;
class Share
{
public:
void Buy()
{
cout << "Buy the Share" << endl;
}
};
class Futures
{
public:
void Buy()
{
cout << "Buy the Futures" << endl;
}
};
class Bond
{
public:
void Buy()
{
cout << "Buy the Bond" << endl;
}
};
class Facade
{
public:
Facade(string &user)
{
m_user = user;
m_share = new Share;
m_futures = new Futures;
m_bond = new Bond;
}
void BuyShare()
{
cout << m_user << " ";
m_share->Buy();
}
void BuyFutures()
{
cout << m_user << " ";
m_futures->Buy();
}
void BuyBond()
{
cout << m_user << " ";
m_bond->Buy();
}
~Facade()
{
delete m_share;
delete m_futures;
delete m_bond;
}
private:
string m_user;
Share* m_share;
Futures* m_futures;
Bond *m_bond;
};
int main()
{
string user_Mike = "Mike";
Facade* facade = new Facade(user_Mike);
facade->BuyBond();
facade->BuyFutures();
facade->BuyShare();
return 0;
}