深入理解设计模式之门面模式
什么是门面模式?
门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,用于访问复杂子系统中的一组接口。门面模式通过封装子系统的复杂性,提供了一个更简单、更易于使用的接口给客户端。
- 门面类:封装了子系统的一组接口,并提供一个简单的接口给客户端使用
- 子系统类:一个或多个,实现子系统的各个接口和功能
为什么要使用门面模式?
在软件开发中,经常会遇到复杂的系统,其中包含了多个子系统和接口。直接使用这些子系统和接口可能会导致代码的复杂性增加,难以维护和理解。而门面模式可以将这些复杂性隐藏在一个门面类中,提供一个简单的接口给客户端使用。使用门面模式可以带来以下好处:
- 简化客户端代码:
门面模式将复杂的子系统封装起来,客户端只需要与门面类进行交互,不需要了解子系统的复杂性,从而简化了客户端代码
。 - 解耦客户端和子系统:
门面模式将客户端与子系统之间的耦合度降低,客户端只需要依赖门面类,而不需要直接依赖子系统,从而提高了代码的灵活性和可维护性
。 - 提高代码的可读性:
门面模式将复杂的子系统封装在一个门面类中,使得代码更加清晰和易于理解
。
如何使用门面模式?
使用门面模式的步骤如下:
- 定义门面类: 创建一个门面类,该类封装了子系统的一组接口,并提供一个简单的接口给客户端使用。
- 实现子系统: 实现子系统的各个接口和功能。
- 在门面类中调用子系统: 在门面类中调用子系统的接口,将复杂的子系统逻辑封装起来。
- 客户端使用门面类: 客户端只需要与门面类进行交互,不需要了解子系统的复杂性。
下面是一个简单的示例代码,演示了如何使用门面模式来简化复杂系统的访问:
案例:我现在要出趟远门,出门前需把所有电器(冰箱、电视、空调…)断电,使用门面模式后我们可以一键将所有电器断电。
- 门面类:电闸
- 子系统:冰箱、电视、空调…
// 子系统类 - 冰箱
class Refrigerator {
public void turnOff() {
System.out.println("冰箱已断电");
}
}
// 子系统类 - 电视
class Television {
public void turnOff() {
System.out.println("电视已断电");
}
}
// 子系统类 - 空调
class AirConditioner {
public void turnOff() {
System.out.println("空调已断电");
}
}
// 门面类 - 门面(Facade)- 相当于电闸
class Facade {
private Refrigerator refrigerator;
private Television television;
private AirConditioner airConditioner;
public Facade() {
refrigerator = new Refrigerator();
television = new Television();
airConditioner = new AirConditioner();
}
public void turnOffAllDevices() {
refrigerator.turnOff();
television.turnOff();
airConditioner.turnOff();
}
}
客户端
// 客户端代码
public class Client {
public static void main(String[] args) {
// 不使用门面模式,一个一个调用,非常麻烦...
Refrigerator refrigerator = new Refrigerator();
Television television = new Television();
AirConditioner airConditioner = new AirConditioner();
refrigerator.turnOff();
television.turnOff();
airConditioner.turnOff();
System.out.println("------------使用门面模式--------------");
// 使用门面模式后,一次即可
Facade facade = new Facade();
facade.turnOffAllDevices();
}
}