设计模式3大特点:设计模式之外观模式
设计模式3大特点:设计模式之外观模式优点:你可以让自己的代码独立于复杂子系统。缺点:外观可能成为与程序中所有类都耦合的上帝对象。javax.faces.context.FacesContext 在底层使用了 LifeCycle、 ViewHandler 和 NavigationHandler 这几个类, 但绝大多数客户端不知道。 javax.faces.context.ExternalContext 在内部使用了 ServletContext、 HttpSession、 HttpServletRequest、 HttpServletResponse 和其他一些类。如何识别外观模式外观可以通过使用简单接口, 但将绝大部分工作委派给其他类的类来识别。 通常情况下, 外观管理着其所使用的对象的完整生命周期。
为了巩固跟复习22个设计模式,每天不定时发表一篇关于设计模式的文稿!今天写的是结构型模式中的 “外观模式(门面模式、Facade)”。
创建型模式:外观模式(门面模式)->
- 定义
外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。
- 外观模式结构
外观模式结构
- 外观 (Facade) 提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求, 知晓如何操作一切活动部件。
- 创建附加外观 (Additional Facade) 类可以避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。 客户端和其他外观都可使用附加外观。
- 复杂子系统 (Complex Subsystem) 由数十个不同对象构成。 如果要用这些对象完成有意义的工作, 你必须深入了解子系统的实现细节, 比如按照正确顺序初始化对象和为其提供正确格式的数据。子系统类不会意识到外观的存在, 它们在系统内运作并且相互之间可直接进行交互。
- 客户端 (Client) 使用外观代替对子系统对象的直接调用。
- 适应场景
- 如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。
- 如果需要将子系统组织为多层结构,可以使用外观模式。
- 实现方式
- 考虑能否在现有子系统的基础上提供一个更简单的接口。 如果该接口能让客户端代码独立于众多子系统类, 那么你的方向就是正确的。
- 在一个新的外观类中声明并实现该接口。 外观应将客户端代码的调用重定向到子系统中的相应对象处。 如果客户端代码没有对子系统进行初始化, 也没有对其后续生命周期进行管理, 那么外观必须完成此类工作。
- 如果要充分发挥这一模式的优势, 你必须确保所有客户端代码仅通过外观来与子系统进行交互。 此后客户端代码将不会受到任何由子系统代码修改而造成的影响, 比如子系统升级后, 你只需修改外观中的代码即可。
- 如果外观变得过于臃肿, 你可以考虑将其部分行为抽取为一个新的专用外观类。
- 外观模式的优缺点
优点:你可以让自己的代码独立于复杂子系统。
缺点:外观可能成为与程序中所有类都耦合的上帝对象。
- 在Java 中外观模式的应用
javax.faces.context.FacesContext 在底层使用了 LifeCycle、 ViewHandler 和 NavigationHandler 这几个类, 但绝大多数客户端不知道。
javax.faces.context.ExternalContext 在内部使用了 ServletContext、 HttpSession、 HttpServletRequest、 HttpServletResponse 和其他一些类。
- 如何识别外观模式
外观可以通过使用简单接口, 但将绝大部分工作委派给其他类的类来识别。 通常情况下, 外观管理着其所使用的对象的完整生命周期。