定义
为子系统中的一组接口提供一个一致(稳定) 的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。
应用场景
- 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。
- 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?
结构
代码示例
cpp
//Facade.h
/****************************************************/
#ifndef FACADE_H
#define FACADE_H
#include <iostream>
#include <list>
#include <vector>
#include <string>
using namespace std;
// 厨师
class Cook
{
public:
// 炒菜
void cookMeal(vector<string> menu) {
for (int i = 0; i < menu.size(); ++i) {
cout << "正在炒:" << menu[i] << endl;
}
}
};
// 服务员
class Waiter
{
public:
// 点菜
void orderDishes(vector<string> menu) {
for (int i = 0; i < menu.size(); ++i) {
cout << "点菜:" << menu[i] << endl;
}
}
// 收拾
void clear() {
cout << "打扫卫生。" << endl;
}
};
// 前台
class Reception
{
public:
// 欢迎
void welcome() {
cout << "欢迎光临!" << endl;
}
// 买单
void bill() {
cout << "买单完成,欢迎下次再来!" << endl;
}
};
// 门面
class Facade
{
public:
// 构造函数
Facade() {
m_cook = new Cook();
m_waiter = new Waiter();
m_reception = new Reception();
}
// 析构函数
~Facade() {
if (m_cook != nullptr) {
delete m_cook;
m_cook = nullptr;
}
if (m_waiter != nullptr) {
delete m_waiter;
m_waiter = nullptr;
}
if (m_reception != nullptr) {
delete m_reception;
m_reception = nullptr;
}
}
// 经营
void manage(vector<string> menu) {
// 欢迎
m_reception->welcome();
// 服务员点菜
m_waiter->orderDishes(menu);
// 厨师炒菜
m_cook->cookMeal(menu);
// 客人用餐
cout << "客人用餐中。" << endl;
// 买单
m_reception->bill();
// 打扫卫生
m_waiter->clear();
}
private:
Cook *m_cook;
Waiter *m_waiter;
Reception *m_reception;
};
#endif
cpp
//test.cpp
/****************************************************/
#include "Facade.h"
int main()
{
Facade *facade = new Facade();
// 餐馆运营
vector<string> menu = { "红烧肉","土豆丝","酸菜鱼" };
facade->manage(menu);
delete facade;
facade = nullptr;
return 0;
}
运行结果
要点总结
- 从客户程序的角度来看,Facade模式简化 了整个组件系统的接口,对于组件内部与外部客户程序来说,达到了一-种" 解耦 "的效果------内部子系统的任何变化不会影响到Facade接口的变化。
- Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。
- Facade设计模式并非一个集装箱,可以任意地放进任何多个对象。Facade模式中组件的内部应该是"相互耦合关系比较大的一系列组件",而不是一个简单的功能集合。