外观模式
概念介绍
外观模式(Facade)
,他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。
角色及使用场景
简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用
。这个模式中,设计到3个角色。
门面角色
:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。子系统角色
:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。客户角色
:通过调用Facede来完成要实现的功能。
使用场景
- 为复杂的模块或子系统提供外界访问的模块;
- 子系统相互独立;
- 在层析结构中,可以使用外观模式定义系统的每一层的入口。
实例
children
/**
* cpu子系统类
*
* @author Administrator
*/
@Slf4j
public class Cpu {
public void start() {
log.info("cpu is start...");
}
public void shutDown() {
log.info("CPU is shutDown...");
}
}
/**
* Disk子系统类
*
* @author Administrator
*/
@Slf4j
public class Disk {
public void start() {
log.info("Disk is start...");
}
public void shutDown() {
log.info("Disk is shutDown...");
}
}
/**
* Memory子系统类
*
* @author Administrator
*/
@Slf4j
public class Memory {
public void start() {
log.info("Memory is start...");
}
public void shutDown() {
log.info("Memory is shutDown...");
}
}
facade
/**
* 门面类(核心)
* @author Administrator
*
*/
@Slf4j
public class Computer
{
private Cpu cpu;
private Memory memory;
private Disk disk;
public Computer()
{
cpu = new Cpu();
memory = new Memory();
disk = new Disk();
}
public void start()
{
log.info("Computer start begin");
cpu.start();
disk.start();
memory.start();
log.info("Computer start end");
}
public void shutDown()
{
log.info("Computer shutDown begin");
cpu.shutDown();
disk.shutDown();
memory.shutDown();
log.info("Computer shutDown end...");
}
}
测试类
@Slf4j
public class ApiTest {
@Test
public void testCommand(){
Computer computer = new Computer();
computer.start();
log.info("=================");
computer.shutDown();
}
}
小结
外观模式也叫门面模式,主要解决的是降低调用方的使用接口的复杂逻辑组合
。这样调用方与实际的接口提供方提供方提供了一个中间层,用于包装逻辑提供API接口。有些时候外观模式也被用在中间件层,对服务中的通用性复杂逻辑进行中间件层包装,让使用方可以只关心业务开发。