22.结构型 - 外观模式 (Facade)

1.定义

  • 为复杂子系统提供高层次的统一接口,简化使用
  • 对外隐藏此系统的具体实现,隔离变化

2.UML类图

在这里插入图片描述

  • 角色介绍
    Facade : 对外统一接口
    SystemA : 子系统接口
    SystemB : 子系统接口

3.UML示例代码

/**
 * Copyright (C), 2016-2020
 * FileName: PhoneFacade
 * Author: wei.zheng
 * Date: 2020/1/9 9:16
 * Description: 用手机来举例描述外观模式,拍照和拨号是常用功能,其实内部由两个子系统分别实现,用户无感知
 */
public class PhoneFacade {
    private ICamera camera;
    private IDialer dialer;

    public PhoneFacade() {
        camera = new CameraImpl();
        dialer = new DialerImpl();
    }

    public void takePicture() {
        camera.open();
        camera.takePicture();
    }

    public void closeCamera() {
        camera.close();
    }

    public void dial() {
        dialer.dial();
    }

    public void hangup() {
        dialer.hangup();
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: ICamera
 * Author: wei.zheng
 * Date: 2020/1/9 9:17
 * Description: 相机接口
 */
public interface ICamera {
    void open();

    void takePicture();

    void close();
}
/**
 * Copyright (C), 2016-2020
 * FileName: IDialer
 * Author: wei.zheng
 * Date: 2020/1/9 9:18
 * Description: 拨号器接口
 */
public interface IDialer {
    void dial();

    void hangup();
}
/**
 * Copyright (C), 2016-2020
 * FileName: CameraImpl
 * Author: wei.zheng
 * Date: 2020/1/9 9:20
 * Description: 相机实现类
 */
public class CameraImpl implements ICamera {
    @Override
    public void open() {
        System.out.println("打开相机");
    }

    @Override
    public void takePicture() {
        System.out.println("拍照");
    }

    @Override
    public void close() {
        System.out.println("关闭相机");
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: DialerImpl
 * Author: wei.zheng
 * Date: 2020/1/9 9:21
 * Description: 拨号器实现类
 */
public class DialerImpl implements IDialer {
    @Override
    public void dial() {
        System.out.println("拨打电话");
    }

    @Override
    public void hangup() {
        System.out.println("挂断电话");
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: Client
 * Author: wei.zheng
 * Date: 2020/1/9 9:23
 * Description: 外观模式/门面模式 用户类
 */
public class Client {
    public static void main(String[] args) {
        PhoneFacade phone = new PhoneFacade();

        phone.takePicture();
        phone.closeCamera();

        phone.dial();
        phone.hangup();
    }
}
// 运行结果
2020-01-09 09:25:44.116 19685-19685/com.example.facade I/System.out: 打开相机
2020-01-09 09:25:44.116 19685-19685/com.example.facade I/System.out: 拍照
2020-01-09 09:25:44.116 19685-19685/com.example.facade I/System.out: 关闭相机
2020-01-09 09:25:44.116 19685-19685/com.example.facade I/System.out: 拨打电话
2020-01-09 09:25:44.116 19685-19685/com.example.facade I/System.out: 挂断电话

4.总结

外观模式实为统一编程接口,为复杂子系统提供简单接口,第三方SDK使用很多。
优点:
隐藏子系统实现细节,减少了客户对子系统的耦合,系统更易使用

缺点:
外观类接口碰撞,子系统接口都由外观类统一对外暴露
违反开闭原则,业务变更需要修改外观类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值