- 在电脑主机(MainFrame)中只需要按下主机的开机按钮(on()),即可调用其它硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(HardDisk)的读取(read())、操作系统(OS)的载入(load())等,如果某一过程发生错误则电脑启动失败。使用外观模式模拟该过程,绘制类图并使用Java语言模拟实现。
Client.java
package Facade;
public class Client {
public static void main(String args[]) {
MainFrame mf=new MainFrame();
System.out.println("电脑启动成功。。。");
mf.on();
System.out.println("电脑启动失败。。。");
mf.off();
}
}
CPU.java
package Facade;
public class CPU {
public void run() {
System.out.println("CPU正在运行");
}
public void off() {
System.out.println("CPU发生错误");
}
}
HardDisk.java
package Facade;
public class HardDisk {
public void read() {
System.out.println("硬盘正在读取");
}
public void off() {
System.out.println("硬盘发生错误");
}
}
MainFrame.java
package Facade;
public class MainFrame {
//维持对子系统对象的引用
private Memory memory;
private CPU cpu;
private OS os;
private HardDisk disk;
public MainFrame() {
memory=new Memory();
cpu=new CPU();
os=new OS();
disk=new HardDisk();
}
//调用子系统对象的业务方法
public void on() {
memory.check();
cpu.run();
os.load();
disk.read();
}
public void off() {
memory.off();
cpu.off();
os.off();
disk.off();
}
}
Memory.java
package Facade;
public class Memory {
public void check() {
System.out.println("内存正在自检");
}
public void off() {
System.out.println("内存发生错误");
}
}
OS.java
package Facade;
public class OS {
public void load() {
System.out.println("OS正在载入");
}
public void off() {
System.out.println("OS发生错误");
}
}
优点 :
① 简化调用 :简化复杂系统的调用过程 , 无需对子系统进行深入了解 , 即可完成调用 ;
② 降低耦合 :使用外观模式 , 只与外观对象进行交互 , 不与复杂的子系统直接进行交互 , 降低了系统间的依赖 , 使耦合关系更低 ; 子系统内部的模块更容易扩展和维护 ;
③ 层次控制 :层次结构复杂的系统 , 有些方法需要提供给系统外部调用 , 有些方法需要在内部使用,将提供给外部的功能定义在外观类中 , 这样既方便调用 , 也能将系统内部的细节隐藏起来 ;
④ 符合迪米特法则 : 最少知道原则 , 用户不需要了解子系统内部的情况 , 也不需要与子系统进行交互 , 只与外观类进行交互 ; 降低了应用层与子系统之间的耦合度 ;
缺点 :
① 子系统扩展风险 : 系统内部扩展子系统时 , 容易产生风险 ;
② 不符合开闭原则 : 外观模式 , 扩展子系统时 , 不符合开闭原则 ;