目的
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加易用。
使用优点
- 需要为复杂子系统提供一个煎蛋接口时
- 客户程序和抽象类的实现部分有很强依赖性时,使用facade让子系统和客户程序、其他子系统之间解耦合,提高系统独立性和可移植性。
- 在定义层次系统的时候使用facade定义每一层的入口点。让每一层之间仅使用facade进行通讯,简化他们之间的依赖关系。
使用场景
假设小陈工作之后发了工资,由于工资很少,所以买了一台超级原始的电脑,电脑启动的时候步骤为
- BIOS启动
- 主引导程序运行
- 硬盘启动
-
操作系统启动
因此,每次小陈启动电脑的时候需要进行4步操作才能开机开始code。但是这是一个非常不好的体验,因为并不能仅仅使用按start键就启动。因此,我们要使用facade模式来实现简化了流程的目的。
在这种情况下,我们使用的UML如下:
facade.png
根据这个UML我们可以看见,我们使用了一个facade将所有的本来需要小陈自己去做的操作全部包装了起来。通过这样的包装,小陈在每次操作的时候只需要和facade打交道了,同时还把多个操作封装到了一起,既简化了操作,又保证了操作顺序的正确性。
代码示例如下:
首先是定义开机的四种操作
/**
* 启动BIOS
*/
public class Bios {
static void startBios(){
System.out.println("开始启动BIOS");
}
}
/**
* 启动引导程序
*/
public class BootStrap {
static void startBootStrap(){
System.out.println("开始启动引导程序");
}
}
/**
* 启动硬盘
*/
public class Disk {
static void startDisk(){
System.out.println("开始启动硬盘");
}
}
/**
* 启动硬盘
*/
public class OperatingSystem {
static void startSystem(){
System.out.println("开始启动操作系统");
}
}
然后我们使用一个facade将所有的操作封装在一起,代码如下
/**
* facade将所有操作封装在一起
*/
public class Facade {
static void powerOn(){
Bios.startBios();
BootStrap.startBootStrap();
Disk.startDisk();
OperatingSystem.startSystem();
}
}
然后我们客户端调用Facade的函数使用开机操作
/**
* 客户端执行开机操作
*/
public class Client {
public static void main(String[] args) {
Facade.powerOn();
}
}
操作结果如下:
开始启动BIOS
开始启动引导程序
开始启动硬盘
开始启动操作系统
网友评论