1.定义
- 为子系统中的一组接口提供一个一致的界面,次模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
- 完美体现了依赖倒转原则以及迪米特法则
2.应用场景
-
设计初期阶段,有意识地将不同地两个层分离,比如三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观facade. 可以实现为复杂的子系统提供一个简单的接口,使得耦合大大降低。
-
开发阶段,子系统往往因为不断地重构演化而变得越来越复杂,增加外观facade可以提供一个简单地接口,减少依赖。
-
在维护一个遗留的大型系统时,可能这个系统已经非常难维护和扩展,但是由于它包含非常重要的功能,新的需求开放必须要依赖它,此时使用外观模式也很合适。为新系统开发一个外观facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与facade对象进行交互,Facade与遗留代码交互所有复杂的工作。
2.代码帮助理解
2.1子系统类,功能模块1
package com.facade;
public class Subsystem1 {
public void method1(){
System.out.println("子系统的方法1");
}
}
2.2子系统类,功能模块2
package com.facade;
public class Subsystem2 {
public void Method2(){
System.out.println("子系统2的方法2");
}
}
2.3子系统类,功能模块3
package com.facade;
public class Subsystem3 {
public void Method3(){
System.out.println("子系统的方法3");
}
}
2.4子系统类,功能模块4
package com.facade;
public class Subsystem4 {
public void method4(){
System.out.println("子系统4的方法4");
}
}
2.5 外观类,Facade
package com.facade;
//外观类需要了解所有的子系统的方法或者属性,并且进行组合,让外界调用
public class Facade {
Subsystem1 subsystem1;
Subsystem2 subsystem2;
Subsystem3 subsystem3;
Subsystem4 subsystem4;
public Facade(){
subsystem1=new Subsystem1();
subsystem2=new Subsystem2();
subsystem3=new Subsystem3();
subsystem4=new Subsystem4();
}
//组合子系统的方法,让外界使用
public void MethodA(){
System.out.println("方法组A....");
subsystem1.method1();
subsystem3.Method3();
subsystem4.method4();
}
public void MethodB(){
System.out.println("方法组B....");
subsystem2.Method2();
subsystem4.method4();
}
}
2.6客户端类
package com.facade;
public class Client {
//外观类Face的作用,客户端可以不知道四个子系统类的存在
public static void main(String[] args) {
Facade facade=new Facade();
facade.MethodA();
facade.MethodB();
}
}
2.7 运行结果