在外观模式中,一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户类与子系统的内部复杂性分隔开,是的客户类只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道。
外观模式的定义如下:
外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口这一子系统更加容易使用。
有两个角色:
1,Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或多个)子系统的功能和责任;
2,SubSystem(子系统角色):在软件系统中可以有一个或多个子系统角色,每一个子系统是一个类的集合,它实现子系统的功能;子系统可以被客户端直接调用,也可以被外观角色调用。
//子系统的代码案例
/**
* 模拟操作系统
*/
public class OperatingSystem {
/**
* 模拟操作系统的载入
*/
public void load(){
System.out.println("开始载入操作系统...");
}
}
/**
* 模拟内存类
*/
public class Memory {
/**
* 模拟内存的自检方法
*/
public void check(){
System.out.println("开始对内存进行自检...");
}
}
/**
* 模拟磁盘类
*/
public class HardDisk {
/**
* 模拟磁盘的读取
*/
public void read(){
System.out.println("开启读取磁盘...");
}
}
/**
* 模拟CPU类
*/
public class CPU {
/**
* 模拟CPU的运行
*/
public void run(){
System.out.println(1/0);
System.out.println("开始运行CPU...");
}
}
//外观角色的代码案例
/**
* 电脑主机
* 外观类
*/
public class Mainframe {
private CPU cpu;
private HardDisk hardDisk;
private Memory memory;
private OperatingSystem operatingSystem;
public Mainframe() {
cpu = new CPU();
hardDisk = new HardDisk();
memory = new Memory();
operatingSystem = new OperatingSystem();
}
public void on() {
try {
hardDisk.read();
operatingSystem.load();
memory.check();
cpu.run();
} catch (Exception e) {
throw new RuntimeException("电脑启动失败!");
}
System.out.printf("电脑启动成功!");
}
}
//客户端
public class Client {
public static void main(String[] args) {
/**
* 案例需求描述:
* 在电脑主机Mainframe中只需要按下主机的开机按钮on(),即可调用其他硬件设备和软件的启动方法,
* 如内存Memory的自检check()方法,CPU的运行run(),硬盘HardDisk的读取read(),操作系统OperatingSystem的载入load()等,
* 如果某一个过程发生错误则电脑启动失败。
* 试用外观模式模拟该过程。
*
*/
Mainframe mainframe = new Mainframe();
mainframe.on();
}
}
【参考文献】:
本文是根据刘伟的《Java设计模式》一书的学习笔记,仅供学习用途,勿做其他用途,请尊重知识产权。
【本文代码仓库】:https://gitee.com/xiongbomy/java-design-pattern.git