概念
外观设计模式也称作facade模式,用来给子系统的一组接口提供统一接口,作为一种结构型模式,主要解决客户端和组件中的子系统有过多的耦合问题。外观模式对子系统提供了一个更高层次,更简单的接口,从而降低了子系统的复杂度和依赖,外观对象隔离了子系统和客户端,从而降低了耦合。
模式结构
外观模式角色结构
- 门面角色(facade):外观模式的核心,被客户调用,熟悉子系统的功能;
- 子系统角色:实现子系统的功能,对facade角色未知;
- 客户角色:调用facade角色完成需要的功能。
示例说明
/**
* 门面角色
*/
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 startup(){
System.out.println("启动电脑开始");
cpu.startup();
memory.startup();
disk.startup();
System.out.println("启动电脑完成");
}
public void shutdown(){
System.out.println("关闭电脑开始");
cpu.shutdown();
memory.shutdown();
disk.shutdown();
System.out.println("关闭电脑完成");
}
}
/**
* 子系统角色1
*/
class CPU{
public void startup(){
System.out.println("启动CPU");
}
public void shutdown(){
System.out.println("关闭CPU");
}
}
/**
* 子系统角色2
*/
class Memory{
public void startup(){
System.out.println("加载内存");
}
public void shutdown(){
System.out.println("清空内存");
}
}
/**
* 子系统角色3
*/
class Disk{
public void startup(){
System.out.println("加载硬盘");
}
public void shutdown(){
System.out.println("卸载硬盘");
}
}
/**
* 客户
*/
class ComputerClient{
public static void main(String[] args){
Computer computer = new Computer();
computer.startup();
System.out.println("===================================");
computer.shutdown();
}
}
运行结果:
启动电脑开始
启动CPU
加载内存
加载硬盘
启动电脑完成
===================================
关闭电脑开始
关闭CPU
清空内存
卸载硬盘
关闭电脑完成
通过Computer一个外观类实现计算机所有部件的控制,客户端只调用外观类,实现了客户端与子系统的解耦。
外观模式的优缺点
- 对客户屏蔽了子系统组件,使客户使用子系统更加方便;
- 实现了子系统与客户之间的松散耦合关系;
- 如果需要也不限制使用子系统类
疑问:这个模式有点类似于网关,那么如果门面角色类一旦挂掉了,不是会影响到所有的子系统的调用么???