前言
- 外观模式是封装API的常用手段.通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.
定义
- 定义:要求一个子系统的外部与内部的通信必须通过一个统一的对象进行.门面模式(Facade模式)提供一个高层次的接口,使得子系统更容易使用
- 使用场景:
1.为一个复杂的子系统提供一个简单统一的接口,对外隐藏子系统的具体实现,隔离变化.
2.当你需要构建一个层次接口的子系统时,使用Facade模式定义子系统中每层的入口点. - 优点:
1.对客户程序隐藏子系统细节,因而减少了客户对于子系统的耦合,能够拥抱变化
2.外观类对子系统的接口封装,使得系统更易于使用. - 缺点:
1.外观类接口膨胀,在一定程度上增加了用户的使用成本
2.外观类没有遵循开闭原则,当业务出现变更时,可能需要直接修改外观类.
UML类图
- Facade:系统对外的统一接口,系统内部系统得工作.
- SystemA,SystemB,SystemC:子系统接口.
一个统一的接口对外提供服务,使得外部程序只通过一个类就可以实现系统内部的多种功能.
实现案例
- 这里通过一个模拟手机拨号等业务的案例来表现外观模式.
1.首先将子类的具体实现写在内部,主要由接口和实现内组成.
/**
* 打电话接口
* Created by max on 2016/4/12.
*/
public interface Phone {
//拨电话
public void dail();
//挂断
public void hangup();
}
/**
* 拨打电话具体的实现类
* Created by max on 2016/4/12.
*/
public class PhoneImpl implements Phone{
@Override
public void dail() {
//写具体业务
}
@Override
public void hangup() {
//写具体业务
}
}
2.将子类具体的实现,封装在一个统一的对外高层次接口里面,其实也就是用户能调用的类,用户只用调取这个类的方法,就可以实现相关功能了.
/**
* 手机的相关功能
* 使用对不同子类引用的相关方法,实现具体的不同业务功能
* Created by max on 2016/4/12.
*/
public class MobilePhone {
private Phone mPhone = new PhoneImpl();
private Cemera mCemera = new SamsungCamera();
public void dail(){
mPhone.dail();
}
public void videoChat(){
mCemera.open();
mPhone.dail();
}
}
总结
- 以上案例是否理解外观模式很简单呢,不过具体应用到实际开发中,还需要我们在真实场景下演练.
- 以下是demo的源码,点击下载.http://download.csdn.net/detail/qq_28690547/9488802