6月更文挑战|设计模式 —— 外观模式

565 阅读2分钟

这是我参与更文挑战的第23天,活动详情查看:更文挑战

外观模式

外观模式也可以叫做门面模式。在开发SDK中是会有大量使用到外观模式的,通过一个外观类使得整个系统接口只有一个统一高层接口,对外部屏蔽实现细节,降低调用成本。

外观模式定义:一个子系统外部和内部通信通过一系列对象进行对应。

外观模式角色:

  1. Facade 系统对外统一接口
  2. 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,减少了使用者的上手成本,提供系统灵活性。 外观模式优点在于对于使用者来说子系统细节是不可见的,减少用户对于子系统的耦合,对接口进行封装易于使用。外观模式的缺点是接口膨胀,子系统若是功能完备,提供的需求功能越多接口数量也就越多,同时也就提高了使用成本。