设计模式 ---- 外观模式
外观模式
外观模式可能和代理模式和模板方法有一些相似之处,
他们都有表面上的:“我不希望客户端直接处理复杂东西,所以我在中间加一个东西”
但是他们的目的不一样
- 代理模式:我不想让客户端直接访问真实对象(控制访问)
- 模板模式:我希望这个算法必须按照固定流程执行(控制流程)
- 外观模式:子系统太复杂,客户端不想了解细节,我来定义一个对外方法一次搞定(简化调用)
模板方法模式强调的是算法的整体流程和骨架,外观模式强调“简化接口、隐藏子系统复杂性”
模板模式的他特征是父类定义过程,子类实现具体方法
外观模式的特征是组合经多个系统类,将多个系统的步骤组合进一个方法种,主要目的是对主业务隐藏具体步骤
还是大象装进冰箱的例子
class Refrigerator
{
public:
void OpenDoor()
{
cout << "打开冰箱门" << endl;
}
void PutElephant()
{
cout << "把大象放进去" << endl;
}
void CloseDoor()
{
cout << "关闭冰箱门" << endl;
}
};
如果没有外观模式
Refrigerator fridge;
fridge.OpenDoor();
fridge.PutElephant();
fridge.CloseDoor();
现在增加了一个外观者
class RefrigeratorFacade
{
private:
Refrigerator fridge;
public:
// 虽然这里也有“打开 → 放入 → 关闭”的执行顺序
// 但外观模式关注的不是定义一个可被子类改变的算法骨架
// 而是把原本需要客户端了解的多个操作封装起来
// 给客户端提供一个更简单的统一入口
// 模板模式中,这里的逻辑上是被卸载父类中的,强调的是按照特定步骤、而这里强调的是将步骤塞进一个方法
void PutElephantIntoRefrigerator()
{
fridge.OpenDoor();
fridge.PutElephant();
fridge.CloseDoor();
}
};
客户端
RefrigeratorFacade facade;
facade.PutElephantIntoRefrigerator();
浙公网安备 33010602011771号