找回密码
 立即注册
首页 业界区 业界 掌握设计模式--外观模式

掌握设计模式--外观模式

损注 2025-6-6 14:43:49
外观模式

外观模式 (Facade Pattern) ,又称为门面模式,是一种结构型设计模式,它通过为一组复杂的子系统提供一个简化的接口,使得客户端可以更容易地访问和使用这些子系统的功能。外观模式隐藏了系统的复杂性,对外提供了一个简单的接口,从而减少了外部系统与子系统之间的依赖关系,提高了系统的可维护性和可扩展性。比如,一个操作系统中有多个复杂的子系统,操作系统的应用与操作系统的底层交互便是通过操作系统接口来实现,应用层的开发不可能直接操作各个子系统的实现,使用外观模式实现分层结构,这样隐藏复杂的底层逻辑的同时简化应用层开发,大大降低耦合度
主要结构


  • 外观 (Facade):为一组复杂的子系统提供简化的接口。
  • 子系统 (Subsystem):实现具体功能的复杂系统,客户端不需要直接与这些子系统交互。
  • 客户端 (Client):需要使用子系统功能的外部代码或模块。
案例实现

假设我们有一个子系统涉及多个模块,比如门禁控制、灯光控制和空调控制。使用外观模式,我们可以提供一个简化的接口来控制所有这些设备。
案例类图

1.png

子系统类
  1. public class DoorSystem {
  2.     public void openDoor() {
  3.         System.out.println("--开门...");
  4.     }
  5.     public void closeDoor() {
  6.         System.out.println("--关门...");
  7.     }
  8. }
  9. class LightSystem {
  10.     public void turnOnLights() {
  11.         System.out.println("--开灯...");
  12.     }
  13.     public void turnOffLights() {
  14.         System.out.println("--关灯...");
  15.     }
  16. }
  17. class ACSystem {
  18.     public void turnOnAC() {
  19.         System.out.println("--打开空调...");
  20.     }
  21.     public void turnOffAC() {
  22.         System.out.println("--关闭空调...");
  23.     }
  24. }
复制代码
外观类
  1. public class SmartHomeFacade {
  2.     private DoorSystem doorSystem;
  3.     private LightSystem lightSystem;
  4.     private ACSystem acSystem;
  5.     public SmartHomeFacade() {
  6.         this.doorSystem = new DoorSystem();
  7.         this.lightSystem = new LightSystem();
  8.         this.acSystem = new ACSystem();
  9.     }
  10.     // 提供简化接口
  11.     public void arriveHome() {
  12.         doorSystem.openDoor();
  13.         lightSystem.turnOnLights();
  14.         acSystem.turnOnAC();
  15.     }
  16.     public void leaveHome() {
  17.         lightSystem.turnOffLights();
  18.         acSystem.turnOffAC();
  19.         doorSystem.closeDoor();
  20.     }
  21. }
复制代码
客户端测试
  1. public class FacadeDemo {
  2.     public static void main(String[] args) {
  3.         SmartHomeFacade homeFacade = new SmartHomeFacade();
  4.         // 当到家时,外观模式简化了操作
  5.         System.out.println("当到家时:");
  6.         homeFacade.arriveHome();
  7.         // 当离家时,外观模式也简化了操作
  8.         System.out.println("当离家时:");
  9.         homeFacade.leaveHome();
  10.     }
  11. }
复制代码
测试结果
当到家时:
--开门...
--开灯...
--打开空调...
当离家时:
--关灯...
--关闭空调...
--关门...
简单分析
子系统类:DoorSystem、LightSystem 和 ACSystem 是独立的模块,它们负责具体的功能。
外观类:SmartHomeFacade 提供了一个简化的接口 (arriveHome 和 leaveHome),通过它,客户端可以简化与各个子系统的交互。
客户端代码:客户端通过 SmartHomeFacade 调用 arriveHome 或 leaveHome 方法来控制门、灯和空调。
通过这种方式,外观模式将复杂的操作封装在一个简单的接口后,客户端无需了解子系统的细节,只需调用外观类提供的简化方法即可。
优缺点和应用场景

优点

  • 简化接口:客户端通过外观接口与复杂的子系统进行交互,避免了直接与多个子系统打交道。
  • 减少依赖:客户端只依赖外观类,减少了与复杂子系统之间的耦合度。
  • 提高系统的灵活性:外观模式为系统提供了一种更简洁的方式来调用子系统,修改子系统时只需要更改外观类,而客户端无需修改。
  • 易于使用:通过提供简单的接口,使得系统的使用更加直观,便于理解。
缺点

  • 引入额外的层次:虽然外观模式简化了接口,但它也引入了一个额外的层次。如果系统本身已经很简单,可能就没有必要使用外观模式。
  • 限制灵活性:外观模式将系统的复杂性隐藏在外部接口后,可能会限制客户端对子系统的细粒度控制。
应用场景

  • 复杂子系统的简化:当系统复杂,且客户端需要通过多个复杂接口进行交互时,可以使用外观模式来简化接口。
  • 集成多个子系统:当多个子系统协同工作时,外观模式可以为这些子系统提供一个统一的接口。
  • 需要解耦的场景:外观模式适用于减少客户端与子系统之间耦合度的场景。
总结

外观模式通过将复杂系统的实现细节隐藏起来,提供一个简单的接口,使得客户端代码更加简洁,降低了系统间的耦合度。这种模式非常适用于需要简化复杂子系统交互的场景。
2.gif

需要查看往期设计模式文章的,可以在个人主页中或者文章开头的集合中查看,可关注我,持续更新中。。。
超实用的SpringAOP实战之日志记录
2023年下半年软考考试重磅消息
通过软考后却领取不到实体证书?
计算机算法设计与分析(第5版)
Java全栈学习路线、学习资源和面试题一条龙
软考证书=职称证书?
软考中级--软件设计师毫无保留的备考分享

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册