Facade
外观模式:为子系统中的一组接口提供了一个一致的界面,此模式定义了一个高层的接口,这个接口使得一子系统更加容易使用。
它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。
体现了依赖倒转和迪米特法则
1 class SubSystemOne { 2 3 public void methodOne(){ 4 System.out.println("子系统方法 - 1"); 5 } 6 7 } 8 9 class SubSystemTwo { 10 11 public void methodTwo(){ 12 System.out.println("子系统方法 - 2"); 13 } 14 15 } 16 17 class SubSystemThree { 18 19 public void methodThree(){ 20 System.out.println("子系统方法 - 3"); 21 } 22 23 }
1 //外观类,它需要了解所有子系统的方法或者属性,进行组合,以备外界调用。 2 public class Facade { 3 4 SubSystemOne subSystemOne; 5 SubSystemTwo subSystemTwo; 6 SubSystemThree subSystemThree; 7 8 public Facade(){ 9 subSystemOne = new SubSystemOne(); 10 subSystemTwo = new SubSystemTwo(); 11 subSystemThree = new SubSystemThree(); 12 } 13 14 public void operateOne(){ 15 subSystemOne.methodOne(); 16 subSystemTwo.methodTwo(); 17 subSystemThree.methodThree(); 18 } 19 20 public void operateTwo(){ 21 subSystemOne.methodOne(); 22 subSystemThree.methodThree(); 23 } 24 }
1 public static void main(String[] args) { 2 //Facade 的调用,客户端可以根本不知三个子系统类的存在。 3 Facade facade = new Facade(); 4 facade.operateOne(); 5 System.out.println("==============="); 6 facade.operateTwo(); 7 }
打印结果:
子系统方法 - 1
子系统方法 - 2
子系统方法 - 3
===============
子系统方法 - 1
子系统方法 - 3
外观模式使用:
设计初期,应该有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑 数据访问层、业务逻辑层、表示层 的层与层之间建立外观(Facade),这样可以为复杂的子系统提供一个简单的接口,使得耦合性大大降低。
其次,在开发的阶段,子系统不断往往因为不断地重构变得复杂,大多模式使用时会产生很多很小的类,这本是好事,但也会给外部调用它们的程序带来使用上的困难,增加外观Facade 可以提供一个简单地接口,减少它们的依赖。
第三,在维护一个遗留的大型系统,可能这个系统已经非常难以维护和扩展,但因为它包含非常重要的功能,新的需求开发必须要依赖它。此时用Facade也是非常适合的。为新的系统开发一个外观 Facade 类,来提供设计粗糙或高度复杂的遗留代码比较清晰简单地接口,让新系统与Facade对象交互,让Facade与遗留代码交互所有复杂的工作。