定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。Facade(门面模式)提供一个高层次的接口,使得子系统更易于使用。精髓在于封装。
使用场景
为一个复杂子系统提供一个简单接口。
当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。
Android 系统中Context具体实现类ContextImpl对Activity ,广播,资源等的封装
通俗一点,一部手机,它有电话功能,拍照功能,听歌功能。通常你一部手机可以完成各种功能,而不是打电话用诺基亚,拍照要相机,听歌要MP3。如果你每使用一个功能就要操作特定的设备,会使得整个过程很复杂,而手机提供了统一的入口,集电话,拍照。听歌功能于一身,使用方便,操作简单。
UML图
源码中例子系统图
优点
- 对客户程序隐藏子系统细节,因而减少了客户对于系统的耦合,能够拥抱变化
- 外观类对子系统的接口封装,使得系统更易于使用。
缺点
- 外观类接口膨胀,由于子系统的接口都有外观类统一对外暴露,使得外观类的API接口较多,在一定程度上增加了用户使用成本。
- 外观类没有遵循开闭原则,当业务出现变更时,可能需要直接修改外观类。
例子
/**
* 子系统2接口(拍照)
* Created by Niwa on 2017/8/11.
*/
public interface Camera {
/**
* open camera
*/
public void open();
/**
* close camera
*/
public void close();
/**
* take camera
*/
public void takePicture();
}
/** 子系统2实现类
* Created by Niwa on 2017/8/11.
*/
public class CameraImpl implements Camera {
@Override
public void open() {
System.out.println("打开相机");
}
@Override
public void close() {
System.out.println("关闭相机");
}
@Override
public void takePicture() {
System.out.println("拍照");
}
}
/** 子系统1接口(打电话)
* Created by Niwa on 2017/8/11.
*/
public interface Phone {
/**
* 打电话
*/
public void dail();
/**
* 挂断
*/
public void hangup();
}
/** 子系统1实现类
* Created by Niwa on 2017/8/11.
*/
public class PhoneImpl implements Phone {
@Override
public void dail() {
System.out.println("打电话");
}
@Override
public void hangup() {
System.out.println("挂断电话");
}
}
/** 手机外观
* Created by Niwa on 2017/8/11.
*/
public class MobilePhone {
private Phone mPhone = new PhoneImpl();
private Camera camera = new CameraImpl();
public void dail(){
mPhone.dail();
}
public void videoChat(){
camera.open();
mPhone.dail();
}
public void takePicture(){
camera.open();
camera.takePicture();
}
}
/** 测试类
* Created by Niwa on 2017/8/11.
*/
public class Test {
public static void main(String[] args){
MobilePhone s6 = new MobilePhone();
s6.dail();
s6.takePicture();
}
}
结果:
打电话
打开相机
拍照
参考:
《Android源码设计模式解析与实战读书》
各大佬博客
源代码:DesignPattern
end