外观模式
一、简介
外观模式在SDK开发中使用频率非常高。通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样可以降低用户的使用成本也对用户屏蔽了很多实现细节。
定义:要求一个子系统的外部与其内部通信必须通过一个统一的对象进行。外观模式提供了一个高层次的接口,是的子系统更加易于使用。
二、使用场景
- 子系统往往因为不断演化而变得越来越复杂甚至肯恩被替换,外观模式提供一个简单的同一接口对外隐藏子系统的具体实现、隔离变化。
- 当需要构建一个层次结构的子系统时使用外观模式定义子系统中每层的入口点。如果子系统之间是相互依赖的你可以让它们通过外观接口进行通信从而简化他们之间的依赖关系。
三、简单实现
这里以手机为例,手机实际上是多个子系统的组合,不同的子系统提供不同功能比如电话、拍照等,手机相当于一个外观类给我们提供了操作这些子系统的同一入口。
//抽象手机类
public abstract class Phone{
public abstract void hangup();
public abstract void dail();
}
//手机实现类
public class PhoneImpl extends Phone{
@Override
public void hangup() {
Log.i(TAG, "hangup: ");
}
@Override
public void dail() {
Log.i(TAG, "dail: ");
}
}
//抽象相机类
public abstract class Camera{
public abstract void open();
public abstract void takePicture();
public abstract void close();
}
//相机实现类
public class CameraImpl extends Camera{
@Override
public void open() {
Log.i(TAG, "open: ");
}
@Override
public void takePicture() {
Log.i(TAG, "takePicture: ");
}
@Override
public void close() {
Log.i(TAG, "close: ");
}
}
//外观模式的外观类
public class MobilePhone{
private Phone phone=new PhoneImpl();
private Camera camera=new CameraImpl();
public void dail(){
phone.dail();
}
public void videoChat(){
camera.open();
phone.dail();
}
public void hangup(){
phone.hangup();
}
public void tackPicture(){
camera.takePicture();
}
public void closeCamera(){
camera.close();
}
}
四、小结
Android中Context类可以看做是一个外观类,它封装了很多操作实际上不是靠Context来实现的而是靠其他子系统来完成,这样我们就可以不用知道如何操作相关子系统来完成对应操作只需通过Context中提供的接口即可。
外观模式的精髓就在于通过高层次结构为用户提供统一的API入口,使得用户通过一个类就能操作整个系统减少了用户的使用成本。
优点
- 对用户隐藏子系统细节,减少了用户对子系统的耦合能够拥抱变化
- 外观类对子系统接口封装使得系统易于使用
缺点
- 外观类接口膨胀,在一定程度上增加了用户使用成本
- 外观类没有遵循开闭原则,当业务出现变化时可能直接修改外观类