外观模式(简化一群类的接口)
2017-11-17 本文已影响0人
钉某人
源码地址 | https://github.com/DingMouRen/DesignPattern |
---|
- Facade系统对外统一接口,
- SystemA SystemB SystemC子系统接口
定义
外观模式为子系统的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
使用场景
- 为一个复杂子系统提供一个简单的接口。(引入的第三方SDK)
- 在构建一个有层次结构的子系统时
协作
客户端通过发送请求给Facade的方式与子系统通讯,Facade将这些消息转发给适当的子系统对象。尽管是子系统在做实际工作,但是Facade模式本身必须将它的接口转换成子系统的接口
举个栗子
假设我们手机只能打电话和拍照。那么通过系统和拍照系统就是所谓的子系统,里面有复杂的逻辑,但是我们不可能去搞懂系统的细节,我们只要能打电话和拍照就行了,我们需要一个外观类帮我们做一些事情,也就是封装,你手里拿着的手机哦。
//子系统的抽象接口:通话系统
public interface Phone {
//打通话系统
void dail();
//关闭通话系统
void hangup();
}
//通话系统的具体实现类
public class PhoneImpl implements Phone {
@Override
public void dail() {
System.out.println("通话系统的打电话功能");
}
@Override
public void hangup() {
System.out.println("通话系统的关闭通话");
}
}
//Facade类:外观类
public class MobilePhone {
private Phone phone = new PhoneImpl();
private Camera camera = new SonyCamera();
//用手机打电话
public void dail(){
phone.dail();
}
//挂断电话
public void hangup(){
phone.hangup();
}
//用手机拍照片
public void takePhoto(){
camera.open();
camera.takePhoto();
}
//退出相机
public void closeCamera(){
camera.close();
}
}
使用
public static void main(String[] args) {
//拿到手机对象
MobilePhone phone = new MobilePhone();
//随便打电话或者去拍照
phone.takePhoto();
}
总结
优点:
- 对客户端隐藏子系统的细节,减少客户对子系统的耦合
- 外观类对子系统的接口封装,使得系统易于使用
缺点:
- 一般会造成外观类的接口膨胀,外观类的api接口很多,增加用户的使用成本
- 外观类没遵循开闭原则,当业务变化时,可能需要直接修改外观类