定义:
为子系统中的一组接口提供统一的接口。它定义了一个更高级别的接口,使子系统更易于使用.
门面模式的本质就是统一多个接口的功能。换句话说,当我们需要用更统一的标准方式来与系统交互时,就可以采用门面模式
UML图
门面模式包含的关键角色有两个:
- 门面系统,负责处理依赖子系统的请求,并将请求代理给适当的子系统进行处理
- 子系统,代表某个领域内的功能实现,比如,订单、用户、支付等,专门处理由门面系统指派的任务
门面模式封装的变化主要是子系统的一切变化(自身复杂性、可能出现的问题等),并且随着子系统的独立演化,子系统可能变得越来越复杂,但是只要和门面系统的交互不发生改变,那么就并不会影响门面系统。就好比,虽然后端研发团队不断地迭代更新 API 版本,但只要接口定义不变,那么前端团队就不需要进行任何修改。
使用场景分析
- 简化复杂系统
- 减少客户端处理的系统数量
- 让一个系统(或对象)为多个系统(或对象)工作
- 联合更多的系统来扩展原有系统
- 作为一个简洁的中间层
总结来说,门面模式在使用的时候能够提供一个简单的概览视图,让使用者能够很方便地去使用
示例代码
/**
* @Description 测试代码
*/
public class Client {
public static void main(String[] args) {
HomeTheaterFacade facade = new HomeTheaterFacade();
facade.ready();
facade.play();
System.out.println("---------------------------");
facade.end();
}
}
/**
* @Description 家庭影院
*/
public class HomeTheaterFacade {
// 定义各个子系统对象
private Light light; // 灯光
private Popcorn popcorn; // 爆米花机
private Stereo stereo; // 立体声
private Projector projector; // 投影仪
private Screen screen; // 屏幕
private DVDPlayer dvdPlayer; // DVD播放器
public HomeTheaterFacade() {
this.light = Light.getInstance();
this.popcorn = Popcorn.getInstance();
this.stereo = Stereo.getInstance();
this.projector = Projector.getInstance();
this.screen = Screen.getInstance();
this.dvdPlayer = DVDPlayer.getInstance();
}
public void ready() {
popcorn.on();
popcorn.pop();
screen.down();
projector.on();
stereo.on();
dvdPlayer.off();
light.dim();
}
public void play() {
dvdPlayer.play();
}
public void pause() {
dvdPlayer.pause();
}
public void end() {
popcorn.off();
light.bright();
screen.up();
projector.off();
stereo.off();
dvdPlayer.off();
}
}
/**
* @Description DVD播放器
*/
public class DVDPlayer {
private DVDPlayer(){}
public static DVDPlayer getInstance() {
return new DVDPlayer();
}
public void on(){
System.out.println("DVD on");
}
public void play(){
System.out.println("DVD play");
}
public void pause(){
System.out.println("DVD pause");
}
public void off(){
System.out.println("DVD off");
}
}
/**
* @Description 灯光
*/
public class Light {
private Light() {
}
public static Light getInstance() {
return new Light();
}
public void on() {
System.out.println("灯光 on");
}
public void dim() {
System.out.println("灯光 dim");
}
public void bright() {
System.out.println("灯光 bright");
}
public void off() {
System.out.println("灯光 off");
}
}
/**
* @Description 爆米花机
*/
public class Popcorn {
private Popcorn() {}
public static Popcorn getInstance() {
return new Popcorn();
}
public void on() {
System.out.println("爆米花 on");
}
public void pop() {
System.out.println("爆米花 pop");
}
public void off() {
System.out.println("爆米花 off");
}
}
/**
* @Description 投影仪
*/
public class Projector {
private Projector() {}
public static Projector getInstance() {
return new Projector();
}
public void on() {
System.out.println("投影仪 on");
}
public void focus() {
System.out.println("投影仪 focus...");
}
public void off() {
System.out.println("投影仪 off");
}
}
/**
* @Description 屏幕
*/
public class Screen {
private Screen(){}
public static Screen getInstance() {
return new Screen();
}
public void up(){
System.out.println("屏幕 上升");
}
public void down(){
System.out.println("屏幕 下降");
}
}
/**
* @Description 立体声
*/
public class Stereo {
private Stereo() {
}
public static Stereo getInstance() {
return new Stereo();
}
public void on() {
System.out.println("立体声 on");
}
public void up() {
System.out.println("立体声 up");
}
public void off() {
System.out.println("立体声 off");
}
}