【设计模式】外观模式
使用频率:★★★★★
一、什么是外观模式
在子系统中的接口之上定义一个更高层次的接口,方便使用子系统中的接口;
二、补充说明
缺点:不符合开闭原则,修改子系统的代码会影响高层接口代码;
优点:引入外观类可以降低系统的复杂度,提高了客户端使用的便捷性;
优点:客户类与子系统解耦;
三、角色
子系统角色
外观角色
客户端角色
四、例子,JAVA实现
模拟电脑开机情景,有三个子系统:BIOS系统,硬盘系统,操作系统;启动过程是先启动BIOS, 然后加载硬盘,然后启动操作系统;
子系统角色,BIOS系统
package com.pichen.dp.structuralpattern.facade; public class BIOS { public void start(){ System.out.println("BIOS start."); } }
子系统角色,硬盘系统
package com.pichen.dp.structuralpattern.facade; public class Disk { public void load(){ System.out.println("Disk load."); } }
子系统角色,操作系统
package com.pichen.dp.structuralpattern.facade; public class OS { /** * 假设启动OS子系统需要用到Disk子系统作为入参 * start * TODO * @Title: start * @Description: TODO * @param @param disk * @return void * @throws */ public void start(Disk disk){ System.out.println("OS start."); } }
外观角色,在子系统之上定义了一个更高层次接口,方便启动PC
package com.pichen.dp.structuralpattern.facade; public class ComputerFacade { private BIOS bios; private Disk disk; private OS os; public ComputerFacade() { bios = new BIOS(); disk = new Disk(); os = new OS(); } public void start(){ bios.start(); disk.load(); os.start(disk); } }
客户端角色,启动PC, 如果不使用外观模式,启动PC较复杂,使用外观模式,简化了客户端操作
package com.pichen.dp.structuralpattern.facade; public class Main { public static void main(String[] args) { ComputerFacade pc = new ComputerFacade(); pc.start(); //不使用外观模式情况 // BIOS bios = new BIOS(); // Disk disk = new Disk(); // OS os = new OS(); // bios.start(); // disk.load(); // os.start(disk); } }
结果打印
BIOS start.
Disk load.
OS start.