1 定义
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,隐藏了系统的复杂性,让子系统更容易使用。
外观模式的意图是要简化复杂的子系统。
1.1 外观模式介绍
外观模式(Facade),它隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。 这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。
1.2 模式结构
简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。在这个模式中,涉及到3个角色。
-
门面角色(Facade): 外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
-
子系统角色(SubSystem): 有各种子系统,分别实现了各自的功能。各个子系统只对Facade提供访问的接口。
-
客户角色(Client): 通过调用Facede角色提供的接口来完成要实现的功能。
使用场景:
- 为复杂的模块或子系统提供外界访问的模块;
- 子系统相互独立;
- 在层析结构中,可以使用外观模式定义系统的每一层的入口。
1.3 实例
每个Computer都有CPU、Memory、Disk。在Computer开启和关闭的时候,相应的部件也会开启和关闭,所以,使用了该外观模式后,会使用户和部件之间解耦。如:
各个子系统:
CPU类:
package facede;
/**
* Created by Michael on 2017/8/8.
*/
/**
* CPU类
*/
public class Cpu {
public void start() {
System.out.println("启动CPU...");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void shutDown() {
System.out.println("关闭CPU...");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Disk类:
package facede;
/**
* Created by Michael on 2017/8/8.
*/
/**
* 硬盘类
*/
public class Disk {
public void start() {
System.out.println("启动硬盘...");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void shutDown() {
System.out.println("关闭硬盘...");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Memory类:
package facede;
/**
* Created by Michael on 2017/8/8.
*/
/**
* 内存类
*/
public class Memory {
public void start() {
System.out.println("启动内存...");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void shutDown() {
System.out.println("关闭内存...");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
门面类(外观模式的核心):
package facede;
/**
* Created by Michael on 2017/8/8.
*/
/**
* Computer类, 作为外观模式中的门面角色.
*/
public class Computer {
private Cpu cpu;
private Disk disk;
private Memory memory;
public Computer() {
this.cpu = new Cpu();
this.disk = new Disk();
this.memory = new Memory();
}
public void start() {
System.out.println("开始启动电脑...");
cpu.start();
disk.start();
memory.start();
System.out.println("电脑启动完毕!");
System.out.println();
}
public void shutDown() {
System.out.println("开始关闭电脑...");
cpu.shutDown();
disk.shutDown();
memory.shutDown();
System.out.println("电脑关闭完毕!");
}
}
客户类:
package facede;
/**
* Created by Michael on 2017/8/8.
*/
/**
* 客户角色
*/
public class Client {
public static void main(String[] args) throws Exception {
Computer computer = new Computer();
computer.start();
Thread.sleep(3000);
computer.shutDown();
}
}
结果: