定义
为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
UML
优点
- 对客户屏蔽了其子系统组件,因而减少了客户处理对象的数目,并使得子系统实用起来更方便。
- 它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。 Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。 Facade模式还可以消除复杂的循环依赖关系,这一点在客户程序与子系统是分别实现的时候尤为重要。
- 如果应用需要,它并不限制它们实用子系统类。因此你可以在系统易用性和通用性之间进行选择。
缺点
- 限制了客户的自由,减少了可变性。
应用场景
- 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
- 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
- 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
示例
假设我们的项目中有一个代码生成工具,用来生成供前后端使用的代码,客户端在调用时需要先加载配置文件,然后再依次生成前后端的代码文件,这个顺序不能乱掉。我们如果直接提供每个小模块的代码给到客户端,那么当系统变得复杂时,调用会变得非常麻烦。这时如果提供一个外观类来管理所有的小模块,在给到客户端调用就会变得非常的方便了。
Java
1 public class Main 2 { 3 public static void main(String[] args) 4 { 5 //使用外观模式可以方便的调用来生成代码 6 new Facade().generate(); 7 } 8 9 /** 10 * 代码生成配置类 11 */ 12 public static class GenerateConfig 13 { 14 public void readConfig() 15 { 16 System.out.println("读取代码生成配置表"); 17 } 18 } 19 20 /** 21 * 生成客户端代码类 22 */ 23 public static class GenerateClientCode 24 { 25 public void generate() 26 { 27 System.out.println("生成客户端代码"); 28 } 29 } 30 31 /** 32 * 生成服务端代码类 33 */ 34 public static class GenerateServerCode 35 { 36 public void generate() 37 { 38 System.out.println("生成服务端代码"); 39 } 40 } 41 42 /** 43 * 代码生成外观模式 44 */ 45 public static class Facade 46 { 47 public void generate() 48 { 49 new GenerateConfig().readConfig(); 50 new GenerateClientCode().generate(); 51 new GenerateServerCode().generate(); 52 } 53 } 54 }