外观模式(Facade Pattern)隐藏系统的复杂性 , 并向客户端提供了可以访问系统的接口,这个接口使得子系统更加容易使用。这种类型的设计模式属于结构型模式,它向现有系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和现有系统类方法的委托调用。
意图
为子系统中的一组接口提供一个一致的界面 , 外观模式定义了一个高层接口,这个接口使子系统更加容易使用。
解决问题
降低访问复杂系统的内部子系统时的复杂度,简化客户端与之接口。
如何解决
客户端不与系统耦合,外观类与系统耦合。
优点
1.减少系统相互依赖
2.提高灵活性
3.提高了安全性
缺点
不符合 开闭原则,如果要改东西,继承重写都不合适
使用场景
1.为复杂的模块或者子系统提供外界访问的模块
2.子系统相对独立
3.预防低水平人员带来的风险
注意事项
在层次化结构中,可以使用外观模式定义系统中每一层的入口。
外观模式的结构图:
C++实现
//外观模式Facade Pattern
/*
应用示例:
假如你想吃一顿大餐,那么我想你要,首先去买菜,然后回到家后自己做菜,最后吃完饭以后要洗碗打扫。
这么一来你需要3个类,Shopper, Cook, Dishwasher, 分别来完成买菜,做菜,洗碗等工作,显然这非常麻烦,能不能简化这个过程?当然可以!去餐馆吃。
餐馆这时候显然就是外观模式了,他把复杂的过程封装到内部,用户不用关心细节。
*/
class Shopper //采购类
{
public:
void shopGoods()
{
cout <<"买菜" << endl;
}
};
class Cook //厨师类
{
public:
void DoCook()
{
cout << "做饭" << endl;
}
};
class DishWasher //洗碗
{
public:
void washDish()
{
cout << "洗碗"<< endl;
}
};
class Restaurant
{
public:
Restaurant()
{}
void HaveMeal()
{
m_shopper.shopGoods();
m_cook.DoCook();
m_washer.washDish();
}
private:
Shopper m_shopper;
Cook m_cook;
DishWasher m_washer;
};
客户端:
int test_Facade() //外观 模式
{
Restaurant rt;
rt.HaveMeal();
system("pause");
return 0;
}