GOF23设计模式-外观模式
外观模式(Facade)
- 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。
一个子系统可能有很多类很多方法,相互调用,如果客户端想要调用其中某一个方法,可能要了解很多类和其中的方法,不便于使用,所以给子系统定义一个门面类,提供一组接口,客户端只跟门面类打交道,使用接口方法,不用了解子系统内是如何调用的。
外观模式结构图
代码实现
- 四个子系统类
/**
* User:tumbler
* Desc:外观模式--子系统类1
*/
public class SubSystemOne {
public void methodOne() {
System.out.println("子系统方法1...");
}
}
/**
* User:tumbler
* Desc:外观模式--子系统类2
*/
public class SubSystemTwo {
public void methodTwo() {
System.out.println("子系统方法2...");
}
}
/**
* User:tumbler
* Desc:外观模式--子系统类3
*/
public class SubSystemThree {
public void methodThree() {
System.out.println("子系统方法3...");
}
}
/**
* User:tumbler
* Desc:外观模式--子系统类4
*/
public class SubSystemFour {
public void methodFour() {
System.out.println("子系统方法4...");
}
}
- 外观类Facade
/**
* User:tumbler
* Desc:外观模式--外观类Facade
* 需要了解子系统所有类的方法和属性,进行组合,以备客户端调用
*/
public class Facade {
SubSystemOne one;
SubSystemTwo two;
SubSystemThree three;
SubSystemFour four;
public Facade() {
one = new SubSystemOne();
two = new SubSystemTwo();
three = new SubSystemThree();
four = new SubSystemFour();
}
/**
* 方法组A
*/
public void methodA() {
System.out.println("方法组A----------");
one.methodOne();
two.methodTwo();
four.methodFour();
}
/**
* 方法组B
*/
public void methodB() {
System.out.println("方法组B----------");
three.methodThree();
four.methodFour();
two.methodTwo();
}
}
- 客户端调用
/**
* User:tumbler
* Desc:外观模式--客户端调用
* 由于Facade的存在,客户端可以不用知道子系统中那些类的存在
*/
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.methodA();
facade.methodB();
}
}
运行结果:
方法组A----------
子系统方法1...
子系统方法2...
子系统方法4...
方法组B----------
子系统方法3...
子系统方法4...
子系统方法2...
何时使用
- 设计初期阶段:应该有意识地将不同的两个层分离出来,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层与表示层之间建立外观Facade。这样可以为一个复杂的子系统提供一个简单的接口,使得耦合大大降低。
- 在开发阶段:子系统往往因不断的重构演化而变得越来越复杂,大多数的模式使用也会产生很多小类,这本是好事,但是这也给外部调用他们的程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少他们之间的依赖。
- 维护阶段:在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为其包含非常重要的功能又不能放弃,新的需求开发必须要依赖他,此时用外观模式Facade也是非常合适的。可以在新系统开发一个外观Facade类,来提供设计粗糙或者高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互复杂的工作。