iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

定義


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、框架或任何其他複雜的類別集合。

為什麼要有外觀模式?


外觀模式存在的主要目的和優點包括以下幾點,解決了軟體設計中常見的問題:

  1. 簡化複雜性:現代軟體系統通常由許多元件、類別和子系統構成,這些元件之間的交互和依賴關係可能非常複雜。外觀模式可以將這些複雜性隱藏在一個獨立的外觀類別中,使客戶端代碼無需了解系統的內部運作。

  2. 提供清晰介面:外觀類別提供了一個清晰、簡單的介面,客戶端代碼可以輕鬆與之互動,而不需了解底層元件的詳細資訊。這有助於降低客戶端與系統之間的耦合度。

  3. 提高可維護性:通過將複雜性封裝在外觀類別中,系統的維護變得更加容易。如果系統的內部結構發生變化,只需修改外觀類別,而不會影響客戶端代碼。

  4. 支援鬆散耦合:外觀模式有助於實現鬆散耦合,因為客戶端代碼僅依賴外觀類別,而不依賴底層元件。這使得系統更容易進行分解和重構。

  5. 改善效能:在某些情況下,外觀模式還可以用於改善效能。外觀類別可以對底層操作進行優化,從而提供更高效的介面供客戶端使用。

UML


C#範例


這次一樣用點心店做舉例(怎麼那麼喜歡點心)
在點心店的情境中,考慮以下因素:

子系統:點心店的內部包含多種甜點,如蛋糕、餅乾、冰淇淋等,每種甜點都有自己的製作過程。

外觀:外觀模式可以是點心店的櫃台店員。櫃台店員提供了一個簡單的窗口,顧客只需告訴店員他們想要什麼,而不需要了解如何製作每種甜品。

客戶端:客戶是點心店的顧客,他們來到店裡訂購甜品,但不需要了解製作過程的細節。

首先我們來建立各個點心的子系統:

// 子系統:蛋糕製作
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();
    }
}

上一篇
[Day15] Design Pattern - Decorator裝飾者模式
下一篇
[Day17] Design Pattern - Flyweight 享元模式
系列文
Design Pattern - 無所不在的設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言