想像你擁有一套家庭影院系統,包含:
每次想看電影,都得依序手動開啟五個裝置;散場時再依序關閉。若順序搞錯或遺漏步驟,體驗大打折扣。這正是軟體開發中「客戶端直接依賴眾多子系統」的寫照——高耦合、難維護、易出錯。
定義:為子系統中的一組介面提供一個一致的高層介面,使子系統更容易使用。
外觀模式並不封殺原有子系統,只是提供一個「簡化入口」。客戶端若需進階功能,仍可直接呼叫子系統;但 90% 的常規操作(如「開啟電影模式」、「關閉電影模式」)只需一行程式碼。

// 投影機
public class Projector
{
public void OpenProjector() => Console.WriteLine("打開投影儀");
public void CloseProjector() => Console.WriteLine("關閉投影儀");
public void SetWideScreen() => Console.WriteLine("投影儀狀態為寬屏模式");
public void SetStandardScreen() => Console.WriteLine("投影儀狀態為標準模式");
}
// 功放機
public class Amplifier
{
public void OpenAmplifier() => Console.WriteLine("打開功放機");
public void CloseAmplifier() => Console.WriteLine("關閉功放機");
}
// 螢幕
public class Screen
{
public void OpenScreen() => Console.WriteLine("打開螢幕");
public void CloseScreen() => Console.WriteLine("關閉螢幕");
}
// DVD 播放機
public class DVDPlayer
{
public void OpenDVDPlayer() => Console.WriteLine("打開 DVD 播放器");
public void CloseDVDPlayer() => Console.WriteLine("關閉 DVD 播放器");
}
// 燈光
public class Light
{
public void OpenLight() => Console.WriteLine("打開燈光");
public void CloseLight() => Console.WriteLine("關閉燈光");
}
public class HomeTheaterFacade
{
private readonly Projector _projector = new Projector();
private readonly Amplifier _amplifier = new Amplifier();
private readonly Screen _screen = new Screen();
private readonly DVDPlayer _dvdPlayer = new DVDPlayer();
private readonly Light _light = new Light();
/// 一鍵開啟觀影模式
public void WatchMovie()
{
Console.WriteLine("=== 正在準備觀影環境 ===");
_projector.OpenProjector();
_projector.SetWideScreen();
_amplifier.OpenAmplifier();
_screen.OpenScreen();
_dvdPlayer.OpenDVDPlayer();
_light.CloseLight(); // 觀影通常關燈
Console.WriteLine("=== 環境就緒,享受電影 ===");
}
/// 一鍵關閉所有設備
public void EndMovie()
{
Console.WriteLine("=== 正在關閉觀影環境 ===");
_light.OpenLight();
_dvdPlayer.CloseDVDPlayer();
_screen.CloseScreen();
_amplifier.CloseAmplifier();
_projector.CloseProjector();
Console.WriteLine("=== 所有設備已關閉 ===");
}
}
class Program
{
static void Main(string[] args)
{
var theater = new HomeTheaterFacade();
// 簡單到只需一行
theater.WatchMovie();
// ... 觀影中可直接操作子系統進階功能
theater._projector.SetStandardScreen(); // 切換回標準模式
theater.EndMovie();
Console.ReadKey();
}
}
| 優點 | 缺點 |
|---|---|
| ✅ 解耦客戶端與子系統 ✅ 簡化介面,降低使用門檻 ✅ 符合「最少知識原則」 |
⚠️ 新增子系統可能需修改外觀類(違反開閉原則) ⚠️ 若外觀過於龐大,可能成為「上帝類」 |
外觀模式以「一個高層介面」隱藏「一群低層操作」,是降低系統耦合度、提升開發體驗的利器。記住:它是簡化入口,而非隔離牆——需要時隨時可繞過外觀直達子系統。