外观模式(简化一群类的接口)

源码地址 https://github.com/DingMouRen/DesignPattern
外观模式(简化一群类的接口)_第1张图片
外观模式.png
  • 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接口很多,增加用户的使用成本
  • 外观类没遵循开闭原则,当业务变化时,可能需要直接修改外观类

你可能感兴趣的:(外观模式(简化一群类的接口))