这是我参与更文挑战的第23天,活动详情查看:更文挑战
外观模式
外观模式也可以叫做门面模式。在开发SDK中是会有大量使用到外观模式的,通过一个外观类使得整个系统接口只有一个统一高层接口,对外部屏蔽实现细节,降低调用成本。
外观模式定义:一个子系统外部和内部通信通过一系列对象进行对应。
外观模式角色:
- Facade 系统对外统一接口
- System1、System2、System3 子系统接口
实战
MobilePhone对应Facade;Phone和Camera对应System1、System2。手机MobilePhone就是一个外观模式,集合各种手机功能能力:电话、相机、短信等。所有这么功能都集成在手机当中,对于用户来说面对的是手机这个对象而不是单独哪个模块。当使用相机时还是在手机上打开相机功能,打电话同样也是在手机上打开电话功能,而不是打电话必须是一个电话机,拍照必须是一个摄像机了。如下代码同理,MobilePhone是主系统,PhoneImpl和CameraImpl是子系统,对MobilePhone做封装为用户提供统一的操作接口,对于用户来说并不知道当拍照时是调用了相机子系统功能,打电话是调用了电话系统,或者是两者都有被调用到。
public interface Phone{
public void hangUp();
}
public PhoneImpl implements Phone{
@override
public void hangUp(){
}
}
public interface Camera{
public void takePhoto();
public void closeCamera();
}
public CameraImpl implements Camera{
@override
public void takePhoto(){
}
@override
public void closeCamera(){
}
}
public class MobilePhone{
private Phone phone = new PhoneImpl();
private Camera camera = new CameraImpl();
public void hangUp(){
phone.hangUp();
}
public void takePhoto(){
camera.open();
camera.takePhoto();
}
public void closeCamera(){
camera.close();
}
}
总结
外观模式相对来讲是使用频率较高的设计模式,主要目的在于封装。通过一个对外结构向外部提供一套统一的API入口,让使用者通过一个类型就能基本操作整个SDK,减少了使用者的上手成本,提供系统灵活性。 外观模式优点在于对于使用者来说子系统细节是不可见的,减少用户对于子系统的耦合,对接口进行封装易于使用。外观模式的缺点是接口膨胀,子系统若是功能完备,提供的需求功能越多接口数量也就越多,同时也就提高了使用成本。