深入理解设计模式之门面模式
什么是门面模式?
门面模式(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();}
}