模式特点
为子系统中的一组接口提供一个一致的界面(外观),外观模式定义了一个高层接口,使得子系统更容易使用。
- 简化复杂子系统的调用,提供统一入口
- 客户端与子系统解耦,降低耦合度
- 不限制客户端直接使用子系统
类图
应用场景
- Qt 中 QMainWindow 封装了菜单栏、工具栏、状态栏的协调
- 编译器前端:词法分析→语法分析→语义分析的统一调用
- 音视频播放器:解码器、音频输出、视频渲染的统一控制
- 机器人控制系统:运动控制、IO 管理、安全监控的统一接口
- SDK 封装:将多个底层库封装为一个简单的 API
示例代码(C++)
// 子系统A - 电源管理 class PowerSystem { public: void powerOn() { std::cout << "电源上电" << std::endl; } void powerOff() { std::cout << "电源断电" << std::endl; }}; // 子系统B - 运动控制 class MotionSystem { public: void init() { std::cout << "运动控制初始化" << std::endl; } void moveToHome() { std::cout << "回零位" << std::endl; }}; // 子系统C - 安全监控 class SafetySystem { public: void check() { std::cout << "安全检查通过" << std::endl; } void enable() { std::cout << "安全监控启用" << std::endl; }}; // 外观 - 机器人启动 class RobotFacade { PowerSystem power; MotionSystem motion; SafetySystem safety; public: void startup() { // 一键启动 power.powerOn(); safety.check(); safety.enable(); motion.init(); motion.moveToHome(); std::cout << "=== 机器人启动完成 ===" << std::endl; } void shutdown() { // 一键关机 motion.moveToHome(); power.powerOff(); std::cout << "=== 机器人已关机 ===" << std::endl; } }; // 客户端:只需调用外观接口 RobotFacade robot; robot.startup(); // 无需关心三个子系统的调用顺序