外观模式
外观模式 (Facade Pattern) ,又称为门面模式,是一种结构型设计模式,它通过为一组复杂的子系统提供一个简化的接口,使得客户端可以更容易地访问和使用这些子系统的功能。外观模式隐藏了系统的复杂性,对外提供了一个简单的接口,从而减少了外部系统与子系统之间的依赖关系,提高了系统的可维护性和可扩展性。比如,一个操作系统中有多个复杂的子系统,操作系统的应用
与操作系统的底层
交互便是通过操作系统接口
来实现,应用层的开发不可能直接操作各个子系统的实现,使用外观模式实现分层结构
,这样隐藏复杂 的底层逻辑的同时简化 应用层开发,大大降低耦合度。
主要结构
- 外观 (Facade):为一组复杂的子系统提供简化的接口。
- 子系统 (Subsystem):实现具体功能的复杂系统,客户端不需要直接与这些子系统交互。
- 客户端 (Client):需要使用子系统功能的外部代码或模块。
案例实现
假设我们有一个子系统涉及多个模块,比如门禁控制、灯光控制和空调控制。使用外观模式,我们可以提供一个简化的接口来控制所有这些设备。
案例类图
子系统类
java
public class DoorSystem {
public void openDoor() {
System.out.println("--开门...");
}
public void closeDoor() {
System.out.println("--关门...");
}
}
class LightSystem {
public void turnOnLights() {
System.out.println("--开灯...");
}
public void turnOffLights() {
System.out.println("--关灯...");
}
}
class ACSystem {
public void turnOnAC() {
System.out.println("--打开空调...");
}
public void turnOffAC() {
System.out.println("--关闭空调...");
}
}
外观类
java
public class SmartHomeFacade {
private DoorSystem doorSystem;
private LightSystem lightSystem;
private ACSystem acSystem;
public SmartHomeFacade() {
this.doorSystem = new DoorSystem();
this.lightSystem = new LightSystem();
this.acSystem = new ACSystem();
}
// 提供简化接口
public void arriveHome() {
doorSystem.openDoor();
lightSystem.turnOnLights();
acSystem.turnOnAC();
}
public void leaveHome() {
lightSystem.turnOffLights();
acSystem.turnOffAC();
doorSystem.closeDoor();
}
}
客户端测试
java
public class FacadeDemo {
public static void main(String[] args) {
SmartHomeFacade homeFacade = new SmartHomeFacade();
// 当到家时,外观模式简化了操作
System.out.println("当到家时:");
homeFacade.arriveHome();
// 当离家时,外观模式也简化了操作
System.out.println("当离家时:");
homeFacade.leaveHome();
}
}
测试结果
当到家时:
--开门...
--开灯...
--打开空调...
当离家时:
--关灯...
--关闭空调...
--关门...
简单分析
子系统类 :DoorSystem
、LightSystem
和 ACSystem
是独立的模块,它们负责具体的功能。
外观类 :SmartHomeFacade
提供了一个简化的接口 (arriveHome
和 leaveHome
),通过它,客户端可以简化与各个子系统的交互。
客户端代码 :客户端通过 SmartHomeFacade
调用 arriveHome
或 leaveHome
方法来控制门、灯和空调。
通过这种方式,外观模式将复杂的操作封装在一个简单的接口后,客户端无需了解子系统的细节,只需调用外观类提供的简化方法即可。
优缺点和应用场景
优点
- 简化接口:客户端通过外观接口与复杂的子系统进行交互,避免了直接与多个子系统打交道。
- 减少依赖:客户端只依赖外观类,减少了与复杂子系统之间的耦合度。
- 提高系统的灵活性:外观模式为系统提供了一种更简洁的方式来调用子系统,修改子系统时只需要更改外观类,而客户端无需修改。
- 易于使用:通过提供简单的接口,使得系统的使用更加直观,便于理解。
缺点
- 引入额外的层次:虽然外观模式简化了接口,但它也引入了一个额外的层次。如果系统本身已经很简单,可能就没有必要使用外观模式。
- 限制灵活性:外观模式将系统的复杂性隐藏在外部接口后,可能会限制客户端对子系统的细粒度控制。
应用场景
- 复杂子系统的简化:当系统复杂,且客户端需要通过多个复杂接口进行交互时,可以使用外观模式来简化接口。
- 集成多个子系统:当多个子系统协同工作时,外观模式可以为这些子系统提供一个统一的接口。
- 需要解耦的场景:外观模式适用于减少客户端与子系统之间耦合度的场景。
总结
外观模式通过将复杂系统的实现细节隐藏起来,提供一个简单的接口,使得客户端代码更加简洁,降低了系统间的耦合度。这种模式非常适用于需要简化复杂子系统交互的场景。
需要查看往期设计模式文章的,可以在个人主页中或者文章开头的集合中查看,可关注我,持续更新中。。。