外观模式(结构型模式)java
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易试用。[DP]安全
外观模式简单点说,就是经过外观类把全部的子系统类进行组合,供外部调用。架构
这样既不暴露内部,也下降了耦合。对照下面这张图能很好的理解外观模式(MVC三层架构就使用到了外观模式)spa
Client:外部调用类,客户端类code
Facade:外观类blog
SubSystem Classes:子系统类接口
例子:启动电脑时,会启动CPU、硬盘、显卡。如今电脑类做为外观类,CPU、硬盘、显卡类做为子系统类,使用电脑的人做为客户端。客户端只容许电脑开机和电脑关机,CPU、硬盘、显卡的启动和中止交给电脑类(外观类)。ip
子系统类集io
/** * @ 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("显卡中止运行"); } }
外观类class
/** * @ 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、硬盘、显卡的启动和中止都是由外观类来完成的。
优势:
缺点:
外观模式减小外部与内部的交互,使系统松散耦合,外部调用简便。