从JDK中学习设计模式——外观模式

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

概述

外观模式(Facade Pattern)是为一组子系统提供一个统一的门面来供外部访问,因此又称为门面模式,它是对象结构型模式

外观模式通过引入外观角色来降低系统的复杂度,使客户类与子系统解耦。例如,张三开了一家水壶制造厂,水壶需要打磨和镀漆,客户只需要告知水壶的需求即可,不必知道打磨和镀漆的具体细节。客户告知的需求就是外观角色,打磨和镀漆都是子系统角色。

结构

外观模式UML.png

  • Facade(外观角色):为客户端提供多个子系统统一的访问方法,它持有多个子系统对象,客户端的请求会通过子系统来完成
  • SubSystem(子系统角色):子系统角色可以有一个或多个,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求。子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

优点

  1. 实现了客户端与子系统的松耦合,客户端可以使用子系统,也可以直接使用外观类。子系统的变化不会影响客户端,只需要调整外观类即可。
  2. 提升了系统的可维护性,一个子系统的变化不会引起其它子系统的变化,可以独立维护。同时,子系统内部的变化也不会影响到外观对象。
  3. 通过外观角色来提供一组对象的访问,使系统更易于使用

缺点

  1. 若不对外观类进行抽象,那么在增加子系统时,会导致对外观类的修改,违反了开闭原则
  2. 不能很好地限制客户端对子系统的直接使用。

应用场景

  1. 为一个复杂的模块或子系统提供一个简单的外界访问。
  2. 客户端程序与多个子系统之间存在依赖,子系统相对独立,并且外界对子系统的访问只要黑箱操作即可。

JDK 中的应用

在 JDK 中 java.lang.Classjava.util.logging.LogManager 都使用了外观模式。java.util.logging.LogManager 是外观角色,其它都是子系统角色

LogManager.png