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!
外觀模式適配模式不同,適配器模式是把當前類或者對象、接口轉變成符合其他條件的東西,而外觀模式是解決類與類之間的依賴關係的,用來提供子系統的一個簡化接口。