外观模式(结构型模式)
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易试用。[DP]
外观模式简单点说,就是通过外观类把所有的子系统类进行组合,供外部调用。
这样既不暴露内部,也降低了耦合。对照下面这张图能很好的理解外观模式(MVC三层架构就使用到了外观模式)

- 子系统不被直接调用
- 外观类去组合所有的子系统类实现,供外部使用。
- 外观类需要知道所有子系统
Client:外部调用类,客户端类
Facade:外观类
SubSystem Classes:子系统类

例子:启动电脑时,会启动CPU、硬盘、显卡。现在电脑类作为外观类,CPU、硬盘、显卡类作为子系统类,使用电脑的人作为客户端。客户端只允许电脑开机和电脑关机,CPU、硬盘、显卡的启动和停止交给电脑类(外观类)。
子系统类集
- /**
- * @ Author :fonxi
- * @ Date :2019/5/24 12:38
- * @ Description:CPU
- */
- public class CPU {
- public void start(){
- System.out.println("CPU开始运行");
- }
-
- public void stop(){
- System.out.println("CPU停止运行");
- }
- }
- /**
- * @ Author :fonxi
- * @ Date :2019/5/24 12:45
- * @ Description:硬盘
- */
- public class HardDisk {
- public void start(){
- System.out.println("硬盘开始运行");
- }
-
- public void stop(){
- System.out.println("硬盘停止运行");
- }
- }
- /**
- * @ Author :fonxi
- * @ Date :2019/5/24 12:45
- * @ Description:显卡
- */
- public class GraphicsCard {
- public void start(){
- System.out.println("显卡开始运行");
- }
-
- public void stop(){
- System.out.println("显卡停止运行");
- }
- }
外观类
- /**
- * @ Author :fonxi
- * @ Date :2019/5/24 12:34
- * @ Description:外观类 电脑类
- */
- public class Facade {
-
- private CPU cpu;
- private GraphicsCard graphicsCard;
- private HardDisk hardDisk;
-
- public Facade(){
- cpu = new CPU();
- graphicsCard = new GraphicsCard();
- hardDisk = new HardDisk();
- }
-
- //电脑开机
- public void startingUp(){
- cpu.start();
- graphicsCard.start();
- hardDisk.start();
- }
-
- //电脑关机
- public void shutdown(){
- cpu.stop();
- graphicsCard.stop();
- hardDisk.stop();
- }
- }
客户端调用类
- /**
- * @ Author :fonxi
- * @ Date :2019/5/24 12:33
- * @ Description:客户端调用类
- */
- public class TestController {
- public void print(){
- Facade facade = new Facade();
- System.out.println("开机");
- facade.startingUp();
- System.out.println("关机");
- facade.shutdown();
- }
- }
输出结果
- 开机
- CPU开始运行
- 显卡开始运行
- 硬盘开始运行
- 关机
- CPU停止运行
- 显卡停止运行
- 硬盘停止运行
很明显,客户端只进行了开关机,而子系统集的CPU、硬盘、显卡的启动和停止都是由外观类来完成的。
- 当子系统类需要很高的安全性,需要隐藏,不被其他人访问时。
- 当子系统类外部使用起来特别复杂时
优点:
- 内部隐藏,安全
- 内外部不直接访问,降低了耦合度
- 减少依赖,提高了灵活度
缺点:
- 违反开闭原则,外观类耦合,修改时麻烦
- 增加外观类,系统复杂性提升
外观模式减少外部与内部的交互,使系统松散耦合,外部调用简便。