阅读原文请访问我的博客BrightLoong's Blog
一. 概述
外观模式(Facade)
,为系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式通过向现有的系统添加一个接口,来隐藏系统的复杂性,用一个一致的界面来面向客户端。
外观模式是结构型设计模式。
其实外观模式在我们平时的开发中有意识或者是无意识的都有使用;比如WEB开发中我们会经常定义一个控制层(Controller),一个业务层(Service),一般来说业务层对控制层接收到的请求提供一个统一的接口来进行统一的处理,在业务层去实现各种不同的逻辑,这里的业务层就相当于一个外观类,它对客户端控制层来说屏蔽了复杂的实现。
二. UML类图
- Facade:外观类,知道哪些子系统负责处理请求,将客户端请求代理给适当的子系统对象。
- SubSystem:子系统,实现子系统功能,处理Facade对象指派的任务。
三. 源码实现
子系统1——SystemOne
package io.github.brightloong.lab.design.facade;
/**
* @author: BrightLoong
* @date: 2018/8/26 20:46
* @description:
*/
public class SystemOne {
public void start() {
System.out.println("SystemOne start");
}
public void shutdown() {
System.out.println("SystemOne shutdown");
}
}
子系统2——SystemTwo
package io.github.brightloong.lab.design.facade;
/**
* @author: BrightLoong
* @date: 2018/8/26 20:46
* @description:
*/
public class SystemTwo {
public void start() {
System.out.println("SystemTwo start");
}
public void shutdown() {
System.out.println("SystemTwo shutdown");
}
}
外观类——Facde
package io.github.brightloong.lab.design.facade;
/**
* @author: BrightLoong
* @date: 2018/8/26 20:46
* @description:
*/
public class Facde {
private SystemOne systemOne;
private SystemTwo systemTwo;
public Facde(SystemOne systemOne, SystemTwo systemTwo) {
this.systemOne = systemOne;
this.systemTwo = systemTwo;
}
public void systemStart() {
systemOne.start();
systemTwo.start();
System.out.println("System start");
}
public void systemShutdown() {
systemOne.shutdown();
systemTwo.shutdown();
System.out.println("System shutdown");
}
}
客户端调用和输出
package io.github.brightloong.lab.design.facade;
/**
* @author: BrightLoong
* @date: 2018/8/26 20:46
* @description:
*/
public class Facde {
private SystemOne systemOne;
private SystemTwo systemTwo;
public Facde(SystemOne systemOne, SystemTwo systemTwo) {
this.systemOne = systemOne;
this.systemTwo = systemTwo;
}
public void systemStart() {
systemOne.start();
systemTwo.start();
System.out.println("System start");
}
public void systemShutdown() {
systemOne.shutdown();
systemTwo.shutdown();
System.out.println("System shutdown");
}
}
输出结果如下:
SystemOne start
SystemTwo start
System start
========================
SystemOne shutdown
SystemTwo shutdown
System shutdown
四. 总结
使用场景
- 为复杂的模块或子系统提供外界访问的模块
- 子系统相互独立
优点
- 松耦合
- 更高的灵活性
- 对于一些客户端来说,提供了安全性,因为封装了复杂的实现,而提供一个统一的接口,客户端不用关心内部的实现。
缺点
- 违背了开闭原则。