什么是外观模式?
外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简化的接口,使得复杂系统或子系统的调用变得更加容易。通过引入外观模式,客户端可以通过一个统一的接口与系统进行交互,而不需要了解系统内部的复杂性。
意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。
何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统的入口。
如何解决:客户端不与系统耦合,外观类与系统耦合。
关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
外观模式的适用场景
- 简化复杂系统的使用:当一个系统包含多个复杂的子系统或组件时,可以使用外观模式来提供一个简化的接口。
- 解耦客户端和子系统:外观模式可以使客户端与子系统解耦,客户端只需要与外观对象交互,而不需要直接与子系统交互。
- 提升代码可维护性:通过引入外观模式,可以使系统的模块化程度提高,增强代码的可读性和可维护性。
应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。 2、当你通过电话给商店下达订单时, 接线员就是该商店的所有服务和部门的外观。 接线员为你提供了一个同购物系统、 支付网关和各种送货服务进行互动的简单语音接口。
外观模式涉及以下核心角色:
-
外观(Facade):
- 提供一个简化的接口,封装了系统的复杂性。外观模式的客户端通过与外观对象交互,而无需直接与系统的各个组件打交道。
-
子系统(Subsystem):
- 由多个相互关联的类组成,负责系统的具体功能。外观对象通过调用这些子系统来完成客户端的请求。
-
客户端(Client):
- 使用外观对象来与系统交互,而不需要了解系统内部的具体实现。
C++实现外观模式
1. 子系统类
首先,定义几个子系统类,每个类实现特定的功能。
#include <iostream>
class SubsystemA {
public:
void operationA() {
std::cout << "SubsystemA: operationA" << std::endl;
}
};
class SubsystemB {
public:
void operationB() {
std::cout << "SubsystemB: operationB" << std::endl;
}
};
class SubsystemC {
public:
void operationC() {
std::cout << "SubsystemC: operationC" << std::endl;
}
};
2. 外观类
然后,定义一个外观类,提供一个简化的接口来调用子系统的功能。
class Facade {
private:
SubsystemA* subsystemA;
SubsystemB* subsystemB;
SubsystemC* subsystemC;
public:
Facade() {
subsystemA = new SubsystemA();
subsystemB = new SubsystemB();
subsystemC = new SubsystemC();
}
~Facade() {
delete subsystemA;
delete subsystemB;
delete subsystemC;
}
void operation() {
subsystemA->operationA();
subsystemB->operationB();
subsystemC->operationC();
}
};
3. 客户端代码
在客户端代码中,通过调用外观类的方法来间接调用子系统的功能。
int main() {
Facade* facade = new Facade();
facade->operation();
delete facade;
return 0;
}
详细解释
- 子系统类:
SubsystemA
、SubsystemB
和SubsystemC
分别实现了系统的不同功能,每个类都有一个操作方法。 - 外观类:
Facade
类持有各个子系统的实例,并在其操作方法operation
中调用这些子系统的具体操作方法。通过外观类,客户端可以统一调用多个子系统的方法。 - 客户端代码:客户端通过外观类的
operation
方法来调用子系统的方法,而不需要了解子系统的具体实现细节。
外观模式的优缺点
优点
- 简化接口:外观模式提供了一个简化的接口,使得客户端可以更容易地使用系统。
- 降低耦合度:客户端与子系统之间通过外观类进行交互,降低了客户端与子系统的耦合度。
- 提高可维护性:通过引入外观类,可以将系统的复杂性封装在子系统内部,增强系统的可维护性。
缺点
- 可能增加额外的代码:引入外观类可能会增加额外的代码量,特别是对于简单系统而言。
- 不易拓展子系统功能:如果需要修改或增加子系统的功能,可能需要同时修改外观类,从而影响代码的灵活性。
实际应用案例
外观模式在现实中有很多应用场景,例如:
- 图形用户界面(GUI):在GUI系统中,外观模式可以用于封装底层的图形绘制、事件处理等操作,提供简化的接口给上层应用使用。
- 数据库访问层:外观模式可以用于封装复杂的数据库访问操作,使得上层应用可以通过简化的接口来进行数据的增删改查操作。
- 网络通信:外观模式可以用于封装底层的网络通信细节,提供简化的接口来进行数据的发送和接收。
总结
外观模式通过提供一个简化的接口,帮助客户端更容易地与复杂系统或子系统进行交互。使用外观模式可以降低系统的复杂性、提高代码的可维护性,并解耦客户端与子系统之间的关系。