定义:
要求一个子系统的外部与内部的通信必须通过一个统一的对象进行。
例子1:
日常中可以打电话、拍照、微信聊天等,没有智能手机之前,这些事情都是分开做的,现在有了智能手机。
你只需要通过调用手机这个统一对象,就可以干所有事情,而且不必知道里面的构造和实现。
例子2:股民炒股
未使用外观模式情况
要让股民尽可能少的与股票直接打交道,给其提供一个蒙面,让股民跟蒙面打交道。这样就符合了迪米特法则,让股民尽可能少的与股票打交道了。增加了外观模式后的类图:
2.实现代码
未使用外观模式情况下,代码如下
子系统代码:
public class SubSystemClass {
public void methodOne(){
System.out.println("子系统方法1");
}
}
class SubSystemClass2{
public void methodTwo(){
System.out.println("子系统方法2");
}
}
class SubSystemClass3{
public void methodThree(){
System.out.println("子系统方法3");
}
}
客户端
public static void main(String[] args) {
//未使用外观模式情况
SubSystemClass s1 = new SubSystemClass();
SubSystemClass2 s2 = new SubSystemClass2();
SubSystemClass3 s3 = new SubSystemClass3();
s1.methodOne();
s2.methodTwo();
s3.methodThree();
}
使用外观模式:新增一个Facade类
/**
* 外观模式:封装子系统,对外提供一个门面方法
*/
public class Facade {
//所有子系统的引用
private SubSystemClass s1 = null;
private SubSystemClass2 s2 = null;
private SubSystemClass3 s3 = null;
//构造子系统的引用
public Facade() {
this.s1 = new SubSystemClass();
this.s2 = new SubSystemClass2();
this.s3 = new SubSystemClass3();
}
/**
* 具体的外观方法
*/
public void facade(){
s1.methodOne();
s2.methodTwo();
s3.methodThree();
}
}
客户端
public static void main(String[] args) {
//使用了外观模式后
System.out.println("-----------------------");
Facade facade = new Facade();
facade.facade();
}
两次的输出结果为:
子系统方法1
子系统方法2
子系统方法3
-----------------------
子系统方法1
子系统方法2
子系统方法3
3.总结
其实外观模式就是我们常见的封装,在我们实际开发中,遇到的各种对子系统各模块封装的逻辑,都可以理解为外观模式
- JDBC封装后的,commons提供的DBUtils类
- Hibernate提供的工具类,Spring JDBC工具类等
Android中
- context中封装了很多操作,只需要调用context就可以做很多事情;
- imageloader