Facade is a structural design pattern that provides a simplified interface to a library, a framework, or any other complex set of classes.
--Refactoring Guru
外觀模式是一種結構型設計模式,它提供了一個簡化的介面給一個library、框架或任何其他複雜的類別集合。
外觀模式存在的主要目的和優點包括以下幾點,解決了軟體設計中常見的問題:
簡化複雜性:現代軟體系統通常由許多元件、類別和子系統構成,這些元件之間的交互和依賴關係可能非常複雜。外觀模式可以將這些複雜性隱藏在一個獨立的外觀類別中,使客戶端代碼無需了解系統的內部運作。
提供清晰介面:外觀類別提供了一個清晰、簡單的介面,客戶端代碼可以輕鬆與之互動,而不需了解底層元件的詳細資訊。這有助於降低客戶端與系統之間的耦合度。
提高可維護性:通過將複雜性封裝在外觀類別中,系統的維護變得更加容易。如果系統的內部結構發生變化,只需修改外觀類別,而不會影響客戶端代碼。
支援鬆散耦合:外觀模式有助於實現鬆散耦合,因為客戶端代碼僅依賴外觀類別,而不依賴底層元件。這使得系統更容易進行分解和重構。
改善效能:在某些情況下,外觀模式還可以用於改善效能。外觀類別可以對底層操作進行優化,從而提供更高效的介面供客戶端使用。
這次一樣用點心店做舉例(怎麼那麼喜歡點心)
在點心店的情境中,考慮以下因素:
子系統
:點心店的內部包含多種甜點,如蛋糕、餅乾、冰淇淋等,每種甜點都有自己的製作過程。
外觀
:外觀模式可以是點心店的櫃台店員。櫃台店員提供了一個簡單的窗口,顧客只需告訴店員他們想要什麼,而不需要了解如何製作每種甜品。
客戶端
:客戶是點心店的顧客,他們來到店裡訂購甜品,但不需要了解製作過程的細節。
首先我們來建立各個點心的子系統:
// 子系統:蛋糕製作
class Cake
{
public void MakeCake()
{
Console.WriteLine("製作蛋糕");
}
}
// 子系統:餅乾製作
class Cookie
{
public void MakeCookie()
{
Console.WriteLine("製作餅乾");
}
}
// 子系統:冰淇淋製作
class IceCream
{
public void MakeIceCream()
{
Console.WriteLine("製作冰淇淋");
}
}
再來是點心店外觀~
// 外觀類別:點心店外觀
class DessertFacade
{
private Cake cake;
private Cookie cookie;
private IceCream iceCream;
public DessertFacade()
{
cake = new Cake();
cookie = new Cookie();
iceCream = new IceCream();
}
public void ServeCake()
{
cake.MakeCake();
}
public void ServeCookie()
{
cookie.MakeCookie();
}
public void ServeIceCream()
{
iceCream.MakeIceCream();
}
}
最後是客戶端!
// 客戶端
class Program
{
static void Main(string[] args)
{
// 創建點心店外觀
DessertFacade dessertFacade = new DessertFacade();
// 客戶訂購甜點
Console.WriteLine("客戶訂購甜點:");
dessertFacade.ServeCake(); // 點蛋糕
dessertFacade.ServeCookie(); // 點餅乾
dessertFacade.ServeIceCream(); // 點冰淇淋
Console.ReadLine();
}
}