什么是外观模式
外观模式就是指通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象.隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.为子系统中的一组接口提供了一个统一的访问接口.这个接口使得子系统更容易被访问或者使用.
必须了解的迪米特法则
如果两个类不必彼此直接通向,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个累哦的某一个方法的话,可以通过第三者转发这个调用。
迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。
外观模式的核心
为子系统提供统一的入口.封装子系统的复杂性,以便客户端使用.
外观模式必须记住的三个角色
门面角色
门面角色是外观模式的核心,供客户用户调用,方便客户角色熟悉子系统角色的功能.内部根据客户角色的需求预定了几种功能的组合.
客户角色
通过调用Facade来完成要实现的功能
子系统角色
实现了子系统的功能.对客户角色和门面角色(facade)是未知的.内部可以有系统内的相互交互,也可以提供给外界调用的接口.
经典案例:电脑的开关机
将电脑开关机的实现细节全部隐藏,只留给客户两个方法start()和shutdown().
子系统角色:CPU、Disk、Memory
cpu:
/*
* 外观模式
* 子系统:CPU
*/
public class CPU {
//开启cpu
public void start() {
System.out.println("CPU is start...");
}
//关闭cpu
public void shutDown() {
System.out.println("CPU is end...");
}
}
Disk:
/*
* 外观模式
* 子系统:磁盘
*/
public class Disk {
//启动磁盘
public void start() {
System.out.println("Disk is start...");
}
//关闭磁盘
public void shutDown() {
System.out.println("Disk is end...");
}
}
Memory:
/*
* 外观模式
* 子系统:内存
*/
public class Memory {
//开启内存
public void start() {
System.out.println("Memory is start...");
}
//停止内存
public void shutDown() {
System.out.println("Memory is end...");
}
}
门面模式角色:Computer
/*
* 外观模式
* 门面类: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...");
}
}
客户角色:Test(使用门面模式的类就是客户)
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
System.out.println("开机");
computer.start();
System.out.println("关机");
computer.shutDown();
}
}
开发中常见的场景
- JDBC封装后的,commons提供的DBUtils类,Hibernate提供的工具类、Spring JDBC工具类等