设计模式(12)外观模式

外观设计模式

先举个例子对这个模式进行一个说明,在公司上班需要买些装备,只需要告诉采购具体的装备名称型号,然后采购会从市场中买回来所有的装备。员工不需要具体知道采购的采购过程,只需要和采购沟通完毕后,采购会将需要的设备买好送过来。

外观模式的功能就和上述类似,它提供了一个外观角色封装了多个复杂的子系统,简化了客户端和子系统之间的交互,降低了系统软件之间的强耦合。如果没有外观类,不同的客户端在需要和多个不同的子系统交互,系统中将存在复杂的引用关系,引入了外观类,原有的复杂的引用关系都由外观类实现,不同的客户端只需要与外观类交互。

在这里插入图片描述

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式结构

其结构如下图所示:
在这里插入图片描述
外观模式一共有以下角色:

  • Facade(外观角色):外观角色可以知道多个相关子系统的功能,它将所有从客户端发来的请求委派给相应的子系统,传递给相应的子系统处理。
  • SubSystem(子系统角色):子系统是一个类,或者由多个类组成的类的集合,它实现子系统具体的功能。

外观模式代码实例

FacadePattern.cpp

#include <iostream>

using namespace std;

//子系统:内存
class Memory
{
    
    
public:
  Memory() {
    
    }

  void selfCheck()
  {
    
    
    cout << "…………内存自检……" << endl;
  }
};

//子系统:CPU
class CPU
{
    
    
public:
  CPU() {
    
    }

  void run()
  {
    
    
    cout << "…………运行CPU运行……" << endl;
  }
};

//子系统:硬盘
class HardDisk
{
    
    
public:
  HardDisk() {
    
    }

  void read()
  {
    
    
    cout << "…………读取硬盘……" << endl;
  }
};

//子系统:操作系统
class OS
{
    
    
public:
  OS() {
    
    }

  void load()
  {
    
    
    cout << "…………载入操作系统……" << endl;
  }
};

//外观类
class Facade
{
    
    
public:
  Facade()
  {
    
    
    memory = new Memory();
    cpu = new CPU();
    hardDisk = new HardDisk();
    os = new OS();
  }

  void powerOn()
  {
    
    
    cout << "正在开机……" << endl;
    
    memory->selfCheck();
    cpu->run();
    hardDisk->read();
    os->load();
    
    cout << "开机完成!" << endl;
  }

private:
  Memory *memory;
  CPU *cpu;
  HardDisk *hardDisk;
  OS *os;
};

FacadePattern.h

#include <iostream>
#include "FacadePattern.h"

int main()
{
    
    
  Facade *facade = new Facade();
  facade->powerOn();

  delete facade;

  return 0;
}

外观模式总结

优点:

  • 外观模式使得客户端不必关心子系统组件,减少了与客户端交互的对象的数量,简化了客户端的编程;
  • 外观模式可以大大降低系统的耦合度;
  • 子系统的变化并不需要修改客户端,只需要适当修改外观类即可;
  • 子系统之间不会相互影响。

缺点:

  • 如果需要增加或者减少子系统,需要修改外观类,违反开闭原则;
  • 并不能限制客户端直接与子系统交互,但如果加强限制,又使得系统灵活度降低。

适用场景:

  • 为访问一系列复杂的子系统提供一个统一的、简单的入口,可以使用外观模式;
  • 客户端与多个子系统之间存在很大依赖,但在客户端编程,又会增加系统耦合度,且使客户端编程复杂,可以使用外观模式。

猜你喜欢

转载自blog.csdn.net/qq_24649627/article/details/115376371