1 概述
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。这样可以避免客户端和子系统之间的紧耦合。
这种模式需要将一系列的子系统组合到外观中,然后将具体的工作交给各个子系统去完成。如此一来,可以简化接口的调用。
其本质就是将系统与客户端交互的地方封装起来。
2 示例
这个模式,总体来说,很简单,理解起来也不困难。
依然以手机为例,手机开机的时候,我们只需要按一下电源键,在电源键的触发事件中,包含了CPU的开启、系统加载、SIM卡信息加载等。如果把每一个模块的接口都暴露出来,让我们一个个去按,那岂不是太坑爹了。而现在我们只需要一个开机接口,就可以实现上述所有模块的通电、加载功能,这就是外观模式的功效。
首先把开机需要用到的模块以及其加载方法定义一下。
CPU:
1 package org.scott.facade; 2 /** 3 * @author Scott 4 * @date 2013-12-9 5 * @description 6 */ 7 public class CPU { 8 public void start(){ 9 System.out.println("CPU has started ...");10 }11 }
SIM卡:
1 package org.scott.facade; 2 /** 3 * @author Scott 4 * @date 2013-12-9 5 * @description 6 */ 7 public class SIM { 8 public void start(){ 9 System.out.println("SIM card has loaded ...");10 }11 }
系统UI:
1 package org.scott.facade; 2 /** 3 * @author Scott 4 * @date 2013-12-9 5 * @description 6 */ 7 public class UI { 8 public void start(){ 9 System.out.println("UI has loaded successfully ...");10 }11 }
所有子系统的操作都封装到我们的外观类中,也就是下面的Phone:
1 package org.scott.facade; 2 /** 3 * @author Scott 4 * @date 2013-12-9 5 * @description 6 */ 7 public class Phone { 8 private CPU cpu; 9 private SIM sim;10 private UI ui;11 12 public Phone(){13 cpu = new CPU();14 sim = new SIM();15 ui = new UI();16 }17 18 public void start(){19 System.out.println("The phone is starting ...");20 cpu.start();21 sim.start();22 ui.start();23 System.out.println("Phone has started successfully!");24 }25 }
也就是这么回事,来个测试类客户端,开机:
1 package org.scott.facade; 2 /** 3 * @author Scott 4 * @date 2013-12-9 5 * @description 6 */ 7 public class FacadeTest { 8 9 public static void main(String[] args) {10 Phone phone = new Phone();11 phone.start();12 }13 14 }
启动结果:
The phone is starting ...CPU has started ...SIM card has loaded ...UI has loaded successfully ...Phone has started successfully!
外观模式适配模式不同,适配器模式是把当前类或者对象、接口转变成符合其他条件的东西,而外观模式是解决类与类之间的依赖关系的,用来提供子系统的一个简化接口。