一、定义:
如果有一个系统,内部分为三个子系统:S1,S2,S3,当用户A调用了子系统S1,S2的接口,用户B也调用了子系统S1,S2的接口。那么当子系统S1,S2发生变化时,它们将会影响到所有调用了子系统的客户,子系统与用户的直接交互无疑使他们之间高度耦合,这个时候用外观模式就是很合适的。外观模式将子系统的接口集成在一个高层接口中,使用者可以直接调用高层的接口而忽略其内部子系统的变化,从而降低了子系统之间的耦合度。运用外观模式后,用户与外观直接交互,而外观承担了与子系统之间交互的责任。外观模式适合提供特定的高层次的综合服务,而非低层次的单项服务。
二、外观模式框图
三、以计算机为例上一个实例
我们知道计算机硬件简单的可以分为CPU,内存(Memory),硬盘(Disks)等,启动/关闭计算机时需要启动/关闭CPU,内存,硬盘,我们就计算机的启动和关闭来呈现外观模式在此的一个应用。
3.1 CPU类
package designpatterns.facade;
/**
* Created by Olive on 2017/11/30.
*/
public class CPU {
public void startup() {
System.out.println("startup the CPU!");
}
public void shutdown() {
System.out.println("shutdown the CPU!");
}
}
3.2 Memory类
package designpatterns.facade;
/**
* Created by Olive on 2017/11/30.
*/
public class Memory {
public void startup() {
System.out.println("startup the Memory!");
}
public void shutdown() {
System.out.println("shutdown the Memory!");
}
}
3.3 Disks类
package designpatterns.facade;
/**
* Created by Olive on 2017/11/30.
*/
public class Disks {
public void startup() {
System.out.println("startup the Disks!");
}
public void shutdown() {
System.out.println("shutdown the Disks!");
}
}
3.4 Computer类(即外观)
package designpatterns.facade;
/**
* Created by Olive on 2017/11/30.
*/
public class Computer {
private CPU cpu;
private Disks disks;
private Memory memory;
public Computer(){
cpu = new CPU();
disks = new Disks();
memory = new Memory();
}
public void startup() {
System.out.println("Computer is starting up!");
cpu.startup();
disks.startup();
memory.startup();
System.out.println("Computer started successfully!");
}
public void shutdown() {
System.out.println("Computer is shutting down!");
cpu.shutdown();
disks.shutdown();
memory.shutdown();
System.out.println("Computer shut down successfully!");
}
}
3.5 User类(即客户端)
package designpatterns.facade;
/**
* Created by Olive on 2017/11/30.
*/
public class User {
public static void main(String[] args){
Computer computer = new Computer();
computer.startup();
System.out.println();
System.out.println("*********************************");
System.out.println();
computer.shutdown();
}
}
3.6 输出结果
Computer is starting up!
startup the CPU!
startup the Disks!
startup the Memory!
Computer started successfully!
*********************************
Computer is shutting down!
shutdown the CPU!
shutdown the Disks!
shutdown the Memory!
Computer shut down successfully!
Process finished with exit code 0