设计模式_12 外观模式
12 外观模式
12.1 概念
通过为多个复杂子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不必关注内部子系统的具体实现细节。降低了程序的复杂度,提高了程序的可维护性。
迪米特法则的典型应用。
和代理模式的区别:代理模式是通过继承方式完成同一种方法。外观模式是通过聚合完成多种方法。
12.2 结构
外观角色:为多个子系统提供一个共同的接口。
子系统角色:实现系统的部分功能,客户可以通过外观角色访问它。
12.3 实现
12.3.1 UML图
12.3.2 代码
#include<iostream>
#include<string>
using namespace std;
class Light {
public:
void on() {
cout << "开灯" << endl;
}
void off() {
cout << "关灯" << endl;
}
};
class AirCondition {
public:
void on() {
cout << "开空调" << endl;
}
void off() {
cout << "关空调" << endl;
}
};
class Audio {
public:
void on() {
cout << "开音响" << endl;
}
void off() {
cout << "关音响" << endl;
}
};
class SmartHomeSystem {
private:
Light* light;
AirCondition* airCondition;
Audio* audio;
public:
SmartHomeSystem() {
light = new Light();
airCondition = new AirCondition();
audio = new Audio();
}
void say(string operation) {
if (operation == "on") {
this->on();
cout << "全部家电已开启\n" << endl;
}
else if (operation == "off") {
this->off();
cout << "全部家电已关闭\n" << endl;
}
else {
cout << "没有这个功能" << endl;
}
}
void on() {
light->on();
airCondition->on();
audio->on();
}
void off() {
light->off();
airCondition->off();
audio->off();
}
};
int main() {
SmartHomeSystem* system = new SmartHomeSystem();
system->say("on");
system->say("off");
system->say("阿巴阿巴");
return 0;
}
12.4 优缺点
12.4.1 优点
降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
对客户屏蔽了子系统组件,减少了客户处理的对象数目,使得子系统使用起来更加容易。
12.4.2 缺点
不符合开闭原则,修改很麻烦。
12.5 使用场景
对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系
当一个复杂的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
当客户端与多个子系统之间存在很大的联系时,引入外观模式可将他们分离,从而提高子系统的独立性和可移植性。