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使用很多。
优点:
隐藏子系统实现细节,减少了客户对子系统的耦合,系统更易使用
缺点:
外观类接口碰撞,子系统接口都由外观类统一对外暴露
违反开闭原则,业务变更需要修改外观类