外观模式(Facade)
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用。
子系统:
子系统一:
public class SubSystemOne {
public void methodOne(){
System.out.println("子系统方法一");
}
}
子系统二:
public class SubSystemTwo {
public void methodTwo(){
System.out.println("子系统方法二");
}
}
子系统三:
public class SubSystemThree {
public void methodThree(){
System.out.println("子系统方法三");
}
}
外观类:
public class Facade {
//外观类,需要了解所有的子系统的方法和属性,进行组合,以备外界调用
private SubSystemOne subSystemOne;
private SubSystemTwo subSystemTwo;
private SubSystemThree subSystemThree;
public Facade(){
subSystemOne = new SubSystemOne();
subSystemTwo = new SubSystemTwo();
subSystemThree = new SubSystemThree();
}
public void method1(){
System.out.println("-----方案一-----");
subSystemOne.methodOne();
subSystemThree.methodThree();
}
public void method2(){
System.out.println("-----方案二---------");
subSystemTwo.methodTwo();
subSystemThree.methodThree();
}
}
客户端:
public class Test {
//不需要知道子系统里面有什么,只需要给外观类提出请求,让外观类与子系统进行交互
public static void main(String[] args) {
Facade facade = new Facade();
facade.method1();
facade.method2();
}
}
-----方案一-----
子系统方法一
子系统方法三
-----方案二---------
子系统方法二
子系统方法三
外观模式完美的体现了依赖倒置原则和最少知道原则,是非常常用的模式之一。
外观模式的使用范围:
1.在设计初期阶段,应该要有意识的将不同的两个层分离。比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层,业务逻辑层和表示层的层与层之间建立外观模式这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低
2.在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式在使用时也都会产生很多很小的类,这本是好事,但是也给外部调用他们的用户程序带来了使用上的困难。增加外观模式可以提供一个简单的接口,减少他们之间的依赖
3.在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须依赖他,此时外观模式就非常的适合。可以为新系统开发一个外观类,来提供设计粗糙或者高度复杂的遗留代码的比较清晰简单的接口,让新系统与外观类对象进行交互,外观类与遗留代码交互所有复杂的工作。