外觀模式要求外部與子系統的溝通必須通過一個統一的外觀對象進行。它提供了一個高層介面,讓子系統更易使用。正如醫院設「接待員」一職,病人只需找接待員,由其代辦掛號、劃價、繳費、取藥等繁瑣流程,屏蔽了內部科室的複雜性。

兩大核心角色:

public class Client {
private static Camera camera1, camera2;
private static Light light1, light2, light3;
private static Sensor sensor;
private static Alarm alarm;
static Client() {
camera1 = new Camera(); camera2 = new Camera();
light1 = new Light(); light2 = new Light(); light3 = new Light();
sensor = new Sensor(); alarm = new Alarm();
}
public static void Main() {
camera1.TurnOn(); camera2.TurnOn();
light1.TurnOn(); light2.TurnOn(); light3.TurnOn();
sensor.Activate(); alarm.Activate();
}
}

public class SecurityFacade {
private static Camera camera1, camera2;
private static Light light1, light2, light3;
private static Sensor sensor;
private static Alarm alarm;
static SecurityFacade() {
camera1 = new Camera(); camera2 = new Camera();
light1 = new Light(); light2 = new Light(); light3 = new Light();
sensor = new Sensor(); alarm = new Alarm();
}
public void Activate() {
camera1.TurnOn(); camera2.TurnOn();
light1.TurnOn(); light2.TurnOn(); light3.TurnOn();
sensor.Activate(); alarm.Activate();
}
public void Deactivate() {
camera1.TurnOff(); camera2.TurnOff();
light1.TurnOff(); light2.TurnOff(); light3.TurnOff();
sensor.Deactivate(); alarm.Deactivate();
}
}
public class Client {
private static SecurityFacade security;
public static void Main() {
security = new SecurityFacade();
security.Activate();
Console.WriteLine("\n--------------------\n");
security.Deactivate();
}
}
客戶端代碼大幅簡化,僅需調用 Activate()/Deactivate(),內部協調邏輯封裝於外觀內,易於維護與擴展。