一句话定义
隐藏系统复杂性,提供统一的接口访问。
使用场景
功能模块比较单一,提供外部接口访问。
第三方的SDK很常见,例如ImageLoader等。
实现要点
1.在调用者与复杂系统之间添加外观层
2.外观类与复杂系统耦合
3.外观持有复杂系统的接口类
情景假设
实现拍照、上网、电话的功能,通过手机统一封装直接使用。
否则需要一个拍照设备,上网设备,电话设备。
实现步骤
1.创建复杂系统功能模块接口
/**
* 电话接口
*
* @author fengzhen
* @version 1.0, 2017/5/31
*/
public interface Call {
/**
* 打电话给xx
*/
void callTo(String mobile);
}
/**
* 相机接口
*
* @author fengzhen
* @version 1.0, 2017/5/31
*/
public interface Camera {
/**
* 拍照
*/
void takePhotos();
}
2.创建功能模块的实现
/**
* 电话的具体实现
*
* @author fengzhen
* @version 1.0, 2017/5/31
*/
public class CallImpl implements Call{
@Override
public void callTo(String mobile) {
Log.i("info", "callTo: ==++打电话给" + mobile );
}
}
/**
* 相机实现
*
* @author fengzhen
* @version 1.0, 2017/5/31
*/
public class CameraImpl implements Camera{
@Override
public void takePhotos() {
Log.i("info", "takePhotos: ==++拍照");
}
}
3.创建外观类,集成功能模块
/**
* 外观类
* 继承电话、相机等功能,提供统一访问
*
* @author fengzhen
* @version 1.0, 2017/5/31
*/
public class Phone {
private Call mCall;
private Camera mCamera;
/**
* 创建外观类,默认创建一个型号的手机,一个型号的相机
*/
public Phone() {
this.mCall = new CallImpl();
this.mCamera = new CameraImpl();
}
/**
* 提供接口拨打电话
*/
public void callTo(String mobile){
mCall.callTo(mobile);
}
/**
* 提供接口访问相机
*/
public void takePhotos(){
mCamera.takePhotos();
}
}
4.调用外观类,使用功能
Phone phone = new Phone();
phone.takePhotos();
phone.callTo("张三的手机111");
优缺点
1.不能够进行扩展,想要扩展只能重新写,杜绝使用者修改、安全
2.调用简单,调用代码简洁,系统依赖少