设计模式之外观模式
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!
外观模式适配模式不同,适配器模式是把当前类或者对象、接口转变成符合其他条件的东西,而外观模式是解决类与类之间的依赖关系的,用来提供子系统的一个简化接口。