定义:
是一种使用频率非常高的设计模式, 它通过引入一个外观角色来简化客户端和子系统之间的操作,为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。
优点:
(1)它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易
(2)它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可
(2) 一个子系统的修改对其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象
缺点:
(1)不能很好地限制客户端直接使用子系统类,如果对客户端访问子 系统类做太多的限制则减少了可变性和灵活性
(2)如果设计不当,增加新的子系统可能需要修改外观类的源代码, 违背了开闭原则
适用范围:
(1)要为访问一系列复杂的子系统提供一个简单入口
(2)客户端程序与多个子系统之间存在很大的依赖性
(3)在层次化结构中,可以使用外观模式定义系统中每一层的入口, 层与层之间不直接产生联系,而是通过外观类建立联系,降低层之间的耦合度
实例:
在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘的(HardDisk)的读取(read())、操作系统(OS)的载入(load())等,如果某一过程发生错误则计算机启动失败。使用外观模式模拟该过程.
实例uml:
实例目录:
实例代码:
CPU.java
package face;
public class CPU {
public void run(){
System.out.println("CPU运行");
}
}
HardDisk.java
package face;
public class HardDisk {
public void read(){
System.out.println("硬盘读取");
}
}
MainFrame.java.java
package face;
public class Mainframe {
private CPU cpu=new CPU();//空对象只能调用static方法
private HardDisk hardDisk=new HardDisk();
private Memory memory=new Memory();
private OS os=new OS();
public void on(){
cpu.run();
hardDisk.read();
memory.check();
os.load();
System.out.println("计算机启动成功!");
}
}
Memory.java
package face;
public class Memory {
public void check(){
System.out.println("内存自检");
}
}
OS.java
package face;
public class OS {
public void load(){
System.out.println("操作系统载入");
}
}
Client.java
package face;
public class Client {
public static void main(String[] args) {
Mainframe mainframe=new Mainframe();
mainframe.on();
System.out.println("软件1928 2019006175");
}
}
运行结果截图:



