写点什么

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

作者:EquatorCoco
  • 2025-01-09
    福建
  • 本文字数:2002 字

    阅读完需:约 7 分钟

外观模式


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


主要结构


  • 外观 (Facade):为一组复杂的子系统提供简化的接口。

  • 子系统 (Subsystem):实现具体功能的复杂系统,客户端不需要直接与这些子系统交互。

  • 客户端 (Client):需要使用子系统功能的外部代码或模块。


案例实现


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


案例类图



子系统类


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("--关闭空调..."); }}
复制代码


外观类


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(); }}
复制代码


客户端测试


public class FacadeDemo {    public static void main(String[] args) {        SmartHomeFacade homeFacade = new SmartHomeFacade();
// 当到家时,外观模式简化了操作 System.out.println("当到家时:"); homeFacade.arriveHome();
// 当离家时,外观模式也简化了操作 System.out.println("当离家时:"); homeFacade.leaveHome(); }}
复制代码


测试结果


当到家时:

--开门...

--开灯...

--打开空调...

当离家时:

--关灯...

--关闭空调...

--关门...


简单分析


子系统类DoorSystemLightSystem 和 ACSystem 是独立的模块,它们负责具体的功能。


外观类SmartHomeFacade 提供了一个简化的接口 (arriveHome 和 leaveHome),通过它,客户端可以简化与各个子系统的交互。


客户端代码:客户端通过 SmartHomeFacade 调用 arriveHome 或 leaveHome 方法来控制门、灯和空调。


通过这种方式,外观模式将复杂的操作封装在一个简单的接口后,客户端无需了解子系统的细节,只需调用外观类提供的简化方法即可。


优缺点和应用场景


优点


  1. 简化接口:客户端通过外观接口与复杂的子系统进行交互,避免了直接与多个子系统打交道。

  2. 减少依赖:客户端只依赖外观类,减少了与复杂子系统之间的耦合度。

  3. 提高系统的灵活性:外观模式为系统提供了一种更简洁的方式来调用子系统,修改子系统时只需要更改外观类,而客户端无需修改。

  4. 易于使用:通过提供简单的接口,使得系统的使用更加直观,便于理解。


缺点


  1. 引入额外的层次:虽然外观模式简化了接口,但它也引入了一个额外的层次。如果系统本身已经很简单,可能就没有必要使用外观模式。

  2. 限制灵活性:外观模式将系统的复杂性隐藏在外部接口后,可能会限制客户端对子系统的细粒度控制。


应用场景


  • 复杂子系统的简化:当系统复杂,且客户端需要通过多个复杂接口进行交互时,可以使用外观模式来简化接口。

  • 集成多个子系统:当多个子系统协同工作时,外观模式可以为这些子系统提供一个统一的接口。

  • 需要解耦的场景:外观模式适用于减少客户端与子系统之间耦合度的场景。


总结


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


文章转载自:渊渟岳

原文链接:https://www.cnblogs.com/dennyLee2025/p/18656375

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
掌握设计模式--外观模式_设计模式_EquatorCoco_InfoQ写作社区