最近在看一些开源的日志库时了解到了门面模式,查了些资料学习了一下。门面模式是我们在设计中经常会使用到的模式,只是在以前的开发中并没有意识到这个是门面模式。

门面模式

英文单词为 facade,音标为 /fəˈsäd/ ,单词的释义为楼房的表面。门面模式将内部复杂的实现逻辑隐藏了起来,对外仅提供简单的接口方便调用者使用。

适用场景

  • 给复杂的系统提供一个简单的接口
  • 系统过于复杂难以理解
  • 多层软件的每一层都需要一个入口点
  • 抽象和实现是紧密耦合的

示例代码

以下是对电脑的面向对象设计的抽象代码,采用了门面模式将电脑内部的复杂结构封装了起来,代码使用C++实现。

#include <memory>

class Cpu {
 public:
  void Freeze();
  void Jump(long position);
  void Execute();
};

class HardDrive {
 public:
  char* Read(long lba, int size);
};

class Memory {
 public:
  void Load(long position, char* data);
};

// Facade:
class ComputerFacade {
 public:
  void Start() {
    cpu_->Freeze();
    memory_->Load(kBootAddress, hard_drive_->Read(kBootSector, kSectorSize));
    cpu_->Jump(kBootAddress);
    cpu_->Execute();
  }

 private:
  std::unique_ptr<Cpu> cpu_ = std::make_unique<Cpu>();
  std::unique_ptr<Memory> memory_ = std::make_unique<Memory>();
  std::unique_ptr<HardDrive> hard_drive_ = std::make_unique<HardDrive>();
};

int main() {
  ComputerFacade computer;
  computer.Start();
}