模式定义
外观模式(Facade Pattern)是一种结构型设计模式,通过为复杂子系统提供统一的简化接口,隐藏其内部复杂性,使客户端能够更便捷地调用子系统功能[1][4][6][9]。
模式结构
外观类(Facade)
- 封装子系统的核心功能,提供高层接口(如
start()
、shutdown()
)供客户端调用。
子系统类(Subsystems) - 实现具体功能(如运动控制、传感器监控),但对外观类无感知。
适用场景
数控系统集成:统一管理运动控制、传感器、冷却等子系统。
简化复杂接口:如多媒体播放器整合音频、视频、字幕模块。
降低耦合:客户端仅依赖外观类,无需直接操作子系统。
C++示例(数控系统操作集成)
场景说明:
设计一个数控系统外观类,封装运动控制、传感器监控和冷却系统的启动/关闭流程。
cpp
#include
// 子系统1:运动控制
class MotionControl {
public:
void moveTo(float x, float y) {
std::cout << "运动控制:移动到坐标(" << x << ", " << y << ")\n";
}
void stop() { std::cout << "运动控制:停止\n"; }
};
// 子系统2:传感器系统
class SensorSystem {
public:
void checkStatus() { std::cout << "传感器:状态正常\n"; }
void shutdown() { std::cout << "传感器:关闭\n"; }
};
// 子系统3:冷却系统
class CoolingSystem {
public:
void activate() { std::cout << "冷却系统:启动\n"; }
void deactivate() { std::cout << "冷却系统:关闭\n"; }
};
// 外观类:数控系统统一接口
class CNCFacade {
private:
MotionControl motionCtrl;
SensorSystem sensorSys;
CoolingSystem coolingSys;
public:
void start() {
coolingSys.activate(); // 先启动冷却系统
sensorSys.checkStatus();// 检查传感器
motionCtrl.moveTo(0, 0);// 初始化位置
std::cout << "数控系统就绪\n";
}
void shutdown() {
motionCtrl.stop(); // 停止运动
sensorSys.shutdown(); // 关闭传感器
coolingSys.deactivate();// 最后关闭冷却
std::cout << "数控系统已关闭\n";
}
};
// 客户端代码
int main() {
CNCFacade cncFacade;
cncFacade.start(); // 一键启动
cncFacade.shutdown(); // 一键关闭
return 0;
}
代码解释
子系统类:
MotionControl
控制机械臂运动,SensorSystem
监控设备状态,CoolingSystem
防止过热。
外观类CNCFacade
:start()
方法按顺序启动冷却、检查传感器、初始化位置,隐藏了子系统的调用细节。shutdown()
方法按安全顺序关闭各子系统,避免硬件损坏。
客户端:- 只需调用外观类的两个方法,无需了解子系统交互逻辑。
模式优点
简化调用:客户端代码量减少70%(对比直接调用子系统)。
解耦:子系统升级不影响客户端(如修改冷却启动逻辑)。
安全封装:强制按顺序启停子系统,避免误操作。