外观模式(Facade) : 外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度. 通过一个类持有所有其他类的引用,然后统一整合再调用的处理过程
作者是个二吊子,如果描述有误请指出.
使用场景
日常编码中,我们会遇到一个处理分成很多个步骤,而每个步骤是对不同的对象进行了操作.我们就会在代码中疯狂调用其他对象操作.这里称为子系统调用.如果我们这个处理在多个地方用到,是不是就很零散,不方便管理.并且如果后续其中一个子系统发生了变化,我其他的是不是要做相应的处理,比如新增了一个处理或者去除了一个处理.这就违反了开闭.也不满足复用.由此引出外观模式
外观模式
uml图
子系统:DVDPlayer,Light,Popcorn,Projector,Screen,Stereo
外观类: HomeTheaterFacade
这里我们按照网上的例子.我们家庭影院的设备众多,如果我要看电影,那么我就需要打开dvd,打开灯光,打开爆米花机,打开投影,降下屏幕,打开立体声.然后才能够看电影.如果每个设备都提供一个单独的控制器,我们的操作就会非常繁琐.多看几次电影估计影院都不要了.由此我们用外观模式进行统一处理,将功能进行一个整合,对外只通过外观类进行操作,而外观类内部封装了相应子系统的各种调用逻辑.这样也提供了一个缓冲层,后续有修改我们可以修改一个地方即可.
/**
* @Description: dvd
* @Author: gaofan
* @Date: 2020/3/23 15:39
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class DVDPlayer {
public static DVDPlayer instance = new DVDPlayer();
public static DVDPlayer getInstance() {
return instance;
}
public void turnOn() {
System.out.println("DVD打开了");
}
public void turnOff() {
System.out.println("DVD关闭了");
}
public void play() {
System.out.println("DVD开始播放了");
}
public void pause() {
System.out.println("DVD暂停播放了");
}
}
/**
* @Description: 灯光
* @Author: gaofan
* @Date: 2020/3/23 15:45
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Light {
public static Light instance = new Light();
public static Light getInstance() {
return instance;
}
public void turnOn() {
System.out.println("打开灯光");
}
public void turnOff() {
System.out.println("关闭灯光");
}
}
/**
* @Description: 爆米花
* @Author: gaofan
* @Date: 2020/3/23 15:41
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Popcorn {
public static Popcorn instance = new Popcorn();
public static Popcorn getInstance() {
return instance;
}
public void turnOn() {
System.out.println("开始制作爆米花");
}
public void turnOff() {
System.out.println("爆米花机关闭了");
}
public void pop() {
System.out.println("爆米花制作完成");
}
}
/**
* @Description: 投影仪
* @Author: gaofan
* @Date: 2020/3/23 15:42
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Projector {
public static Projector instance = new Projector();
public static Projector getInstance() {
return instance;
}
public void turnOn() {
System.out.println("投影仪打开了");
}
public void turnOff() {
System.out.println("投影仪关闭了");
}
public void focus() {
System.out.println("投影仪聚焦了");
}
}
/**
* @Description: 屏幕
* @Author: gaofan
* @Date: 2020/3/23 15:43
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Screen {
public static Screen instance = new Screen();
public static Screen getInstance() {
return instance;
}
public void turnUp() {
System.out.println("屏幕上升");
}
public void turnDown() {
System.out.println("屏幕下降");
}
}
/**
* @Description: 立体声
* @Author: gaofan
* @Date: 2020/3/23 15:44
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Stereo {
public static Stereo instance = new Stereo();
public static Stereo getInstance() {
return instance;
}
public void turnOn() {
System.out.println("打开立体声");
}
public void turnOff() {
System.out.println("关闭立体声");
}
}
类型: 外观模式
原理: 以外观类进行统一调用,让其中具体的调用逻辑透明,用户不需要关心内部具体的子系统调用过程,可以进行直接使用.后续如果需要修改或者新增可以非常方便.
瞎掰扯: 我们在工程中其实用到了很多类似外观模式,比如我们一个controller接收到一个请求后进行处理,但是处理的过程非常多,我们就用一个service进行封装,具体的子系统调用以及逻辑躲在service层中处理,我们对外只提供service接口,你只需要知道service的存在即可.这其实就是一种外观模式.service中处理的类我们也能看做外观类.它是打包了一系列操作的.
本文借鉴尚硅谷Java设计模式,韩顺平图解java,传送门