Android 設計模式 - 外觀模式
1. 定義
外部與一個子系統的通訊必須通過一個統一的外觀物件進行,為子系統中的一組介面提供一個一致的介面,外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
2. 作用
為了實現客戶類和子系統的解耦,降低系統的使用複雜度。比如說,我們晚上下班回家後,要開啟電燈、空調、電視,如果能有個控制器,實現一鍵開啟這些電器的功能就好了。
3. 結構
外觀模式包含如下角色:
- Facade: 外觀角色
- SubSystem:子系統角色
4. 實現

類圖
- 子系統角色,就是上面提到的電燈、空調、電視,都可以被開啟和關閉。
public class LightSystem { public void turnOn() { System.out.println("Turn on the light"); } public void turnOff() { System.out.println("Turn off the light"); } }
public class TelevisionSystem { public void turnOn() { System.out.println("Turn on the tv"); } public void turnOff() { System.out.println("Turn off the tv"); } }
public class AirConditionSystem { public void turnOn() { System.out.println("Turn on the air-condition"); } public void turnOff() { System.out.println("Turn off the air-condition"); } }
- 外觀角色,控制器,把各種電器的開閉都封裝在這裡,對外只提供一鍵操作的介面。
public class FacadeController { private LightSystem lightSystem; private TelevisionSystem televisionSystem; private AirConditionSystem airConditionSystm; public FacadeController() { lightSystem = new LightSystem(); televisionSystem = new TelevisionSystem(); airConditionSystm = new AirConditionSystem(); } public void onKeyTurnOn() { lightSystem.turnOn(); televisionSystem.turnOn(); airConditionSystm.turnOn(); } public void onKeyTurnOff() { lightSystem.turnOff(); televisionSystem.turnOff(); airConditionSystm.turnOff(); } }
- 客戶類,使用控制器一鍵操作開關,省時又省力。
public class FacadeTest { public static void main(String[] args){ System.out.println("-------- Turn on ----------"); FacadeController facadeController = new FacadeController(); facadeController.onKeyTurnOn(); System.out.println("-------- Turn off ----------"); facadeController.onKeyTurnOff(); } }
5. 優缺點
1. 優點:
對客戶遮蔽子系統元件,減少了客戶處理的物件數目並使得子系統使用起來更加容易。它實現了子系統與客戶之間的鬆耦合關係,並降低了大型軟體系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程。
2. 缺點:
不能很好地限制客戶使用子系統類,而且在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的原始碼,違背了「開閉原則」。
3. 使用場景:
要為一個複雜子系統提供一個簡單介面;客戶程式與多個子系統之間存在很大的依賴性;在層次化結構中,需要定義系統中每一層的入口,使得層與層之間不直接產生聯絡。
【附錄】

資料圖