文章目录
概述
外观模式又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
举个例子,在没有只能家居的时候,我们开灯,开空调,开电视等等一系列操作,都需要我们一件一件来完成;在有了智能家居以后,在智慧生活设定指定的程序,就可以实现一键开启指定的家居。
结构
外观(Facade
)模式包含以下主要角色:
- 外观(
Facade
)角色: 为多个子系统对外提供一个共同的接口。 - 子系统(
Sub System
)角色: 实现系统的部分功能,客户可以通过外观角色访问它。
案例实现
以我们熟知的智能家居为例:
智能音箱就相当于我们的外观类,而家居就相当于一个一个的系统,只需要操作智能音箱就可以实现所有家电的开关。
子系统【电灯、电视、空调】:
java
//电灯类
public class Light {
public void on() {
System.out.println("打开电灯....");
}
public void off() {
System.out.println("关闭电灯....");
}
}
//电视类
public class TV {
public void on() {
System.out.println("打开电视....");
}
public void off() {
System.out.println("关闭电视....");
}
}
//空调类
public class AirCondition {
public void on() {
System.out.println("打开空调....");
}
public void off() {
System.out.println("关闭空调....");
}
}
外观类【智能音箱】:
java
//智能音箱类
public class SmartAppliancesFacade {
private Light light;
private TV tv;
private AirCondition airCondition;
public SmartAppliancesFacade() {
light = new Light();
tv = new TV();
airCondition = new AirCondition();
}
public void say(String message) {
if(message.contains("打开")) {
on();
} else if(message.contains("关闭")) {
off();
} else {
System.out.println("我还听不懂你说的!!!");
}
}
//一键开电器
private void on() {
light.on();
tv.on();
airCondition.on();
}
//一键关电器
private void off() {
light.off();
tv.off();
airCondition.off();
}
}
测试:
java
public class Client {
public static void main(String[] args) {
//创建外观对象
SmartAppliancesFacade facade = new SmartAppliancesFacade();
//客户端直接与外观对象进行交互
facade.say("打开");
System.out.println("================");
facade.say("关闭");
}
}
优缺点
优点:
- 简化了调用过程,无需了解深入子系统,防止带来风险;
- 减少系统依赖、松散耦合,外观模式讲客户端和子系统之间进行解耦;
- 更好的划分访问层次;
- 符合迪米特法则,即最少知道原则。
缺点:
- 增加子系统、扩展子系统行为容易引入风险;
- 不符合开闭原则,如果需要新增或者修改子系统的功能,可能需要修改外观类。