设计模式-外观(门面)模式
外观模式介绍
外观模式,也成为门面模式,它隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。
适用方要完成一个功能,需要调用提供方的多个接口、方法,调用过程复杂时,我们可以再提供一个高层接口(新的外观),将复杂的调用过程向适用方隐藏。
演变方式:
简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。
- 门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
- 子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
- 客户角色:通过调用Facede来完成要实现的功能
使用场景
- 为复杂的模块或子系统提供外界访问的模块;
- 子系统相互独立;
- 在层析结构中,可以使用外观模式定义系统的每一层的入口
代码实例
举一个电脑启动,内部各子系统如CPU、磁盘、内存也会跟随着一起启动的例子。
首先是各个子系统:
public class CPU {
public void start() {
System.out.println("cpu is start...");
}
public void shutdown() {
System.out.println("cpu is shutdown...");
}
}
public class Disk {
public void start() {
System.out.println("disk is start...");
}
public void shutdown() {
System.out.println("disk is shutdown...");
}
}
public class Memory {
public void start() {
System.out.println("memory is start...");
}
public void shutdown() {
System.out.println("memory is shutdown...");
}
}
然后是门面类,Computer:
public class Computer {
private CPU cpu;
private Disk disk;
private Memory memory;
public Computer() {
cpu = new CPU();
disk = new Disk();
memory = new Memory();
}
public void start() {
System.out.println("computer start begin");
cpu.start();
disk.start();
memory.start();
System.out.println("computer start end");
}
public void shutdown() {
System.out.println("computer shutdown begin");
cpu.shutdown();
disk.shutdown();
memory.shutdown();
System.out.println("computer shutdown end");
}
}
然后是客户端调用:
public class ClientMain {
public static void main(String[] args) {
Computer computer = new Computer();
computer.start();
computer.shutdown();
}
}
从上面的实例来看,有了这个Facade类,也就是Computer类,用户就不用亲自去调用子系统中的Disk,Memory、CPU类了,不需要知道系统内部的实现细节,甚至都不用知道系统内部的构成。客户端只需要跟Facade交互就可以了
总结
优点
- 松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护
- 简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可
- 更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节