外观模式
外观模式(Facade Pattern)隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个能够统一访问的高层接口,这个接口使得子系统更容易被访问或者使用。
设计原则:最少知识原则:只和你的密友谈话
外观模式-提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观。
外观将客户从一个复杂的子系统中解耦。
实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。
模式结构和定义
外观类(Facade):为调用端提供统一的调用接口,外观类知道那些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象
调用者(Client):外观接口的调用者
子系统的集合 :指模块或者子系统,处理Facade对象指派的任务,他是功能的实际提供者。
应用实例
/**
* 系统A
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class SystemAService {
public void start() {
System.out.println("SystemAService start");
}
public void on() {
System.out.println("SystemAService on");
}
public void off() {
System.out.println("SystemAService off");
}
}
/**
* 系统B
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class SystemBService {
public void start() {
System.out.println("SystemBService start");
}
public void on() {
System.out.println("SystemBService on");
}
public void off() {
System.out.println("SystemBService off");
}
}
/**
* 系统C
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class SystemCService {
public void start() {
System.out.println("SystemCService start");
}
public void on() {
System.out.println("SystemCService on");
}
public void off() {
System.out.println("SystemCService off");
}
}
/**
* 外观服务
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class SystemFacade {
/**
* 子系统A
*/
private SystemAService systemAService;
/**
* 子系统B
*/
private SystemBService systemBService;
/**
* 子系统C
*/
private SystemCService systemCService;
public SystemFacade() {
this.systemAService = new SystemAService();
this.systemBService = new SystemBService();
this.systemCService = new SystemCService();
}
/**
* start服务
*/
public void start() {
systemAService.start();
systemBService.start();
systemCService.start();
}
/**
* 统一开服务
*/
public void on() {
systemAService.on();
systemBService.on();
systemCService.on();
}
/**
* 统一关服务
*/
public void off() {
systemAService.off();
systemBService.off();
systemCService.off();
}
}
/**
* 客户端调用
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class Client {
public static void main(String[] args) {
SystemFacade systemFacade = new SystemFacade();
// 调用高层接口,让子系统更容易使用
systemFacade.start();
// 调用高层接口,让子系统更容易使用
systemFacade.on();
// 调用高层接口,让子系统更容易使用
systemFacade.off();
}
}
优点和不足
优点
- 松耦合:解除客户端和子系统之间的耦合,让子系统内部的模块功能更易于扩展和维护。
- 易用性:客户端不必知道子系统复杂的内部实现方式,只需跟门面交互即可。
- 内外分离:子系统中,有些方法是对系统外的,有些方法是对系统内部相互交互使用的。子系统把暴露给外部的功能集中到门面中,从而实现客户端在不知道子系统内部细节前提下的调用
缺点
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适
使用场景
- 为复杂的模块或子系统提供外界访问的模块
- 子系统相互独立
- 在层析结构中,可以使用外观模式定义系统的每一层的入口