C++ 设计模式之外观模式
简介
1、外观模式 (Facade)是一种结构性设计模式,提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,使得子系统更易用。
2、外观模式 (Facade)应用场景包括但不限于:
2.1、当你想为一个复杂的子系统提供一个简单的接口时。
2.2、当系统需要分层时,可以使用外观作为每层的入口点,方便层与层之间的通信。
2.3、当你希望将你的代码与一个复杂的第三方库分离时。
3、外观模式 (Facade)的构成
3.1、外观类
class Computer
{
public:
void Start();
private:
CPU cpu;
Memory memory;
HardDrive hardDrive;
};
3.2、子系统
class CPU
{
public:
void Freeze();
void Jump(int position);
void Execute();
};
4、外观模式 (Facade)的优点
4.1、简化了客户端调用:客户端只需要与外观接口交互,不必关心子系统的复杂性。
4.2、松耦合:外观模式提高了子系统的独立性和可移植性,因为它们不依赖于客户端的具体实现。
4.3、易于维护和扩展:子系统升级改变时,只需要调整外观层,不需改动客户端代码。
5、外观模式 (Facade)的缺点
5.1、不符合开闭原则:扩展子系统可能需要修改外观类或客户端的代码。
5.2、可能成为单点故障:如果外观层出现问题,可能会影响到整个系统。
简单示例
1、定义
// 子系统1
class CPU
{
public:
void Freeze();
void Jump(int position);
void Execute();
};
// 子系统2
class Memory
{
public:
void Load(int position, const std::string& data);
};
// 子系统3
class HardDrive
{
public:
std::string Read(int lba, int size);
};
// 外观类
class Computer
{
public:
void Start();
private:
CPU cpu;
Memory memory;
HardDrive hardDrive;
};
2、实现
void CPU::Freeze()
{
std::cout << "CPU is freezing." << std::endl;
}
void CPU::Jump(int position)
{
std::cout << "Jump to boot address." << std::endl;
}
void CPU::Execute()
{
std::cout << "CPU is executing commands." << std::endl;
}
void Memory::Load(int position, const std::string& data)
{
std::cout << "Loading data into memory." << std::endl;
}
std::string HardDrive::Read(int lba, int size)
{
return "Some boot data";
}
void Computer::Start()
{
cpu.Freeze();
memory.Load(0, hardDrive.Read(0, 1024));
cpu.Jump(1);
cpu.Execute();
}
3、调用
Computer computer;
computer.Start();