外观模式
1.模式动机与定义
模式动机
- 一个客户类需要和多个业务类交互,有时候这些需要交互的业务类会作为一个整体出现
- 引入一个新的外观类(Facade)来负责和多个业务类【子系统(Subsystem)】进行交互,而客户类只需与外观类交互
- 为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互
- 没有外观类:每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大
- 引入外观类:客户类只需要直接与外观类交互,客户类与子系统之间原有的复杂引用关系由外观类来实现,从而降低了系统的合度
模式定义
- 外观模式(Facade Pattern):外部与子系统的通信通过一个统一的外观对象进行,为子系统中的一组接口提供一个统一的入口
- 外观模式定义了一个高层接口,这个接口使得子系统更加容易使用
- 外观模式又称为门面模式,它是一种对象结构型模式
2.模式结构与分析
模式结构
外观模式包含如下角色
- Facade:外观角色:在客户端可以调用这个角色的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
- SubSystem:子系统角色:在软件系统中可以同时有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理有外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观仅仅是另一个客户端而已。
模式分析
- 根据“单一职责原则”,在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。
- 外观模式也是“迪米特法则”的体现,通过引入一个新的外观类可以降低原有系统的复杂度同时降低客户类与子系统类的耦合度
- 外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。
- 外观模式的目的在于降低系统的复杂程度
- 外观模式从很大程度上提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。
//外观类示例代码
public class Facade {
private SubSystemA objl = new SubSystemA();
private SubSystemB obj2= new SubSystemB();
private SubSystemC obj3 = new SubSystemC();
public void method(){
obi1.method();
obj2.method();
obj3.method();
}
}
3.模式效果与应用
优点
- 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易,通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
- 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可
- 一个子系统的修改对其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象,降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程。
缺点
- 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性
- 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则
使用情况
当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。
客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
在层次化结构中,可以使用外观模式定义系统中每-层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
模式应用
- 外观模式应用于JDBC数据库操作
- Session外观模式是外观模式在Java EE框架中的应用。
浙公网安备 33010602011771号