外观模式(Facade)
外观模式:隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。
迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用。
外观模式核心:为子系统提供统一的入口。封装子系统的复杂性,以便客户端调用。
外观模式分为三个角色:
- 门面角色:外观模式的核心。被客户角色调用,熟悉子系统的功能。内部根据客户角色的需求预订了几种功能的组合。
- 子系统角色:实现了子系统的功能。对客户角色和Facade是未知的。内部可以有系统内的相互交互,也可以提供给外界调用的接口。
- 客户角色:通过调用Facade来完成要实现的功能。
外观模式:主要是让客户端和子系统解耦,让子系统更容易扩展与维护,并且让客户端不需要知道子系统内部的实现,只关注门面角色即可。
案例:想组装一台电脑,如果自己去组装需要挑选cpu,disk等硬件,需要对这些硬件有一定的了解,这样比较麻烦,这时可以使用外观模式,给钱给一个比较懂电脑的人,让他去帮你挑cpu,disk并组装电脑,是不是比较方便。
门面角色
package com.kevin.结构型模式.外观模式.facade;
/**
* @author kevin
* @version 1.0
* @description 门面类
* @createDate 2019/3/2
*/
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.shutDowm();
memory.shutDown();
System.out.println("Computer shutDown end...");
}
}
子系统角色
package com.kevin.结构型模式.外观模式.facade;
/**
* @author kevin
* @version 1.0
* @description cpu子系统类
* @createDate 2019/3/2
*/
public class CPU {
public void start(){
System.out.println("CPU is start...");
}
public void shutDown(){
System.out.println("CPU is end...");
}
}
package com.kevin.结构型模式.外观模式.facade;
/**
* @author kevin
* @version 1.0
* @description Disk子系统类
* @createDate 2019/3/2
*/
public class Disk {
public void start(){
System.out.println("Disk is start...");
}
public void shutDowm(){
System.out.println("Disk is end...");
}
}
package com.kevin.结构型模式.外观模式.facade;
/**
* @author kevin
* @version 1.0
* @description Memory子系统类
* @createDate 2019/3/2
*/
public class Memory {
public void start(){
System.out.println("Memory is start...");
}
public void shutDown(){
System.out.println("Memory is end...");
}
}
客户角色(测试外观模式)
package com.kevin.结构型模式.外观模式.facade;
/**
* @author kevin
* @version 1.0
* @description 测试外观模式
* @createDate 2019/1/18
*/
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
System.out.println("买电脑,将钱给中介(门面类),由中介挑选cpu,disk等...");
computer.start();
System.out.println("购买中");
computer.shutDown();
System.out.println("买到电脑...");
}
}
开发中常见的场景
使用频率很高。哪里都会遇到。各种技术和框架中,都有外观模式的使用。如:
- JDBC封装后的,commons提供的DBUtils类,Hibernate提供的工具类、Spring JDBC工具类等