1、外观设计模式概述:
一的接口,使得子系统更容易被客户端使用。外观模式通过定义一个高层接口,将复杂的子系统逻辑封装起来,使客户端与子系统的交互变得简单明了。
外观模式包含以下角色:
- 外观(Facade):提供一个简化的接口,用于访问子系统的功能。
- 子系统(Subsystems):实现一组具体功能的类。子系统可以独立工作,但通常客户端通过外观类与子系统交互。
2、外观设计模式的适用场景:
- 当需要为一组复杂的子系统提供一个简单的接口时。
- 当需要降低客户端与子系统之间的耦合度时。
- 当需要对子系统进行分层时,可以使用外观模式为每个子系统级别提供一个入口点。
3、外观设计模式的优点:
- 简化接口:外观模式为客户端提供了一个简化的接口,使客户端更容易使用子系统。
- 降低耦合:外观模式降低了客户端与子系统之间的耦合度,使得子系统的变更对客户端的影响更小。
- 提高可维护性:通过将复杂的子系统逻辑封装在外观类中,可以降低代码的复杂度,提高可维护性。
- 举例说明:一个文件系统可能包含多个子系统,如读取、写入、删除等功能。通过使用外观模式,可以为客户端提供一个简单的接口,而无需客户端了解文件系统内部的复杂逻辑。
4、外观设计模式的缺点:
- 不适用于所有场景:外观模式可能不适用于需要访问子系统内部详细功能的场景。
- 可能引入额外的复杂性:如果子系统已经足够简单,引入外观模式可能会导致额外的复杂性。
- 举例说明:在一个简单的图形界面库中,如果所有的功能都已经被设计为易于使用,引入外观模式可能会让代码更加复杂,而没有太多实际价值。
5、用C++实现一个外观设计模式例子:
#include <iostream>
// 子系统1:CPU
class CPU {
public:
void start() {
std::cout << "CPU started." << std::endl;
}
void shutdown() {
std::cout << "CPU shutdown." << std::endl;
}
};
// 子系统2:Memory
class Memory {
public:
void load() {
std::cout << "Memory loaded." << std::endl;
}
void free() {
std::cout << "Memory freed." << std::endl;
}
};
// 子系统3:HardDrive
class HardDrive {
public:
void read() {
std::cout << "HardDrive read data." << std::endl;
}
void write() {
std::cout << "HardDrive wrote data." << std::endl;
}
};
// 外观类:Computer
class Computer {
public:
Computer() : cpu_(new CPU()), memory_(new Memory()), hard_drive_(new HardDrive()) {}
~Computer() {
delete cpu_;
delete memory_;
delete hard_drive_;
}
void start() {
cpu_->start();
memory_->load();
hard_drive_->read();
std::cout << "Computer started." << std::endl;
}
void shutdown() {
hard_drive_->write();
memory_->free();
cpu_->shutdown();
std::cout << "Computer shutdown." << std::endl;
}
private:
CPU* cpu_;
Memory* memory_;
HardDrive* hard_drive_;
};
int main() {
Computer* computer = new Computer();
computer->start();
computer->shutdown();
delete computer;
return 0;
}
在这个例子中,我们首先定义了三个子系统:CPU、Memory 和 HardDrive。每个子系统都有自己的操作,如启动、关闭、读取和写入等。
接着,我们创建了一个外观类 Computer,包含了上述子系统的对象。在外观类中,我们定义了 start() 和 shutdown() 方法,这些方法分别封装了子系统的操作,简化了客户端与子系统的交互。
在 main 函数中,我们创建了一个 Computer 对象,通过调用 start() 和 shutdown() 方法来启动和关闭计算机。这样,客户端不需要直接与子系统交互,从而简化了客户端的操作,降低了代码的复杂度。