定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。
举个例子,我们在启动计算机时,只需按一下开关键,无需关系里面的磁盘、内存、cpu、电源等等这些如何工作,我们只关心他们帮我启动好了就行。实际上,由于里面的线路太复杂,我们也没办法去具体了解内部电路如何工作。主机提供唯一一个接口“开关键”给用户就好。
模式结构
示例
/** * cpu子系统类 */
public class CPU {
public static final Logger LOGGER = Logger.getLogger(CPU.class);
public void start() {
LOGGER.info("cpu is start...");
}
public void shutDown() {
LOGGER.info("CPU is shutDown...");
}
}
/** * Disk子系统类 */
public class Disk {
public static final Logger LOGGER = Logger.getLogger(Disk.class);
public void start() {
LOGGER.info("Disk is start...");
}
public void shutDown() {
LOGGER.info("Disk is shutDown...");
}
}
/** * Memory子系统类 */
public class Memory {
public static final Logger LOGGER = Logger.getLogger(Memory.class);
public void start() {
LOGGER.info("Memory is start...");
}
public void shutDown() {
LOGGER.info("Memory is shutDown...");
}
}
/** * 门面类(核心) */
public class Computer {
public static final Logger LOGGER = Logger.getLogger(Computer.class);
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer() {
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void start() {
LOGGER.info("Computer start begin");
cpu.start();
disk.start();
memory.start();
LOGGER.info("Computer start end");
}
public void shutDown() {
LOGGER.info("Computer shutDown begin");
cpu.shutDown();
disk.shutDown();
memory.shutDown();
LOGGER.info("Computer shutDown end...");
}
}
/** * 客户端类 */
public class Cilent {
public static final Logger LOGGER = Logger.getLogger(Cilent.class);
public static void main(String[] args) {
Computer computer = new Computer();
computer.start();
LOGGER.info("=================");
computer.shutDown();
}
}
从上面的实例来看,有了这个Facade类,也就是Computer类,用户就不用亲自去调用子系统中的Disk,Memory、CPU类了,不需要知道系统内部的实现细节,甚至都不用知道系统内部的构成。客户端只需要跟Facade交互就可以了。
Android中的实例
那么Android哪里使用到了外观模式呢?依然回到Context,Android内部有很多复杂的功能比如startActivty、sendBroadcast、bindService等等,这些功能内部的实现非常复杂,如果你看了源码你就能感受得到,但是我们无需关心它内部实现了什么,我们只关心它帮我们启动Activity,帮我们发送了一条广播,绑定了Activity等等就够了。