设计模式 ---- 外观模式

外观模式

外观模式可能和代理模式和模板方法有一些相似之处,

他们都有表面上的:“我不希望客户端直接处理复杂东西,所以我在中间加一个东西”

但是他们的目的不一样

  • 代理模式:我不想让客户端直接访问真实对象(控制访问)
  • 模板模式:我希望这个算法必须按照固定流程执行(控制流程)
  • 外观模式:子系统太复杂,客户端不想了解细节,我来定义一个对外方法一次搞定(简化调用)

模板方法模式强调的是算法的整体流程和骨架,外观模式强调“简化接口、隐藏子系统复杂性”

模板模式的他特征是父类定义过程,子类实现具体方法

外观模式的特征是组合经多个系统类,将多个系统的步骤组合进一个方法种,主要目的是对主业务隐藏具体步骤

还是大象装进冰箱的例子

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();
posted on 2026-09-06 17:11  咸云闲鱼  阅读(3)  评论(0)    收藏  举报