【23種設計模式】外觀模式(十)

碼農阿亮發表於2023-09-26

前言

外觀模式,英文名稱是:Facade Pattern。我們先從名字上來理解一下“外觀模式”。我看到了“外觀”這個詞語,就想到了“外表”這個詞語,兩者有著很相近的意思。就拿談戀愛來說,“外表”很重要,如果第一眼看著很舒服、有眼緣,那就有交往下去的可能。如果長的“三寸釘、枯樹皮”,估計就夠嗆了。在這方面,“外觀”和“外表”有著相同的作用。在軟體系統中,要完成一個功能,需要很多介面呼叫,不僅增加了開發難度,也增加了除錯成本和維護的複雜度。不如我們把這些介面再封裝一次,給一個很好的“外觀”,讓使用者使用更方便,只需呼叫一個介面,就可以完成以前呼叫多個介面的來完成任務。這個模式很簡單,大家很容易理解,可能大家在編碼的過程中已經不止一次使用過該模式了,只是不知道名字罷了。

外觀模式的定義

為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。  

image

外觀模式的組成

  • 外觀角色(Facade):在客戶端可以呼叫它的方法,在外觀角色中可以知道相關的(一個或者多個)子系統的功能和責任;在正常情況下,它將所有從客戶端發來的請求委派到相應的子系統去,傳遞給相應的子系統物件處理。

  • 子系統角色(SubSystem):在軟體系統中可以有一個或者多個子系統角色,每一個子系統可以不是一個單獨的類,而是一個類的集合,它實現子系統的功能;每一個子系統都可以被客戶端直接呼叫,或者被外觀角色呼叫,它處理由外觀類傳過來的請求;子系統並不知道外觀的存在,對於子系統而言,外觀角色僅僅是另外一個客戶端而已

外觀模式的程式碼實現

馬上就到“雙十一”了,人們又開始瘋狂的購買了。其實購買的過程很複雜,但是我們在購買的過程只需要選擇自己喜歡的商品,也可以加入購物車,最後點選付款就完成了。其實這個過程沒有那麼簡單。我們下面就模仿一下購買的過程吧。

購買過程有幾點必須要做的事情:

1、身份驗證安全,沒有認證是無效使用者。
2、系統安全,檢查系統環境,防止注入、跨站和偽造等攻擊
3、網銀安全,檢查付款地址的有效性,檢查閘道器是否正常

安全子系統定義
 /// <summary>
    /// 身份認證子系統A
    /// </summary>
    public class AuthoriationSystemA
    {
        public void MethodA()
        {
            Console.WriteLine("執行身份認證");
        }
    }
 /// <summary>
    /// 系統安全子系統B
    /// </summary>
    public class SecuritySystemB
    {
        public void MethodB()
        {
            Console.WriteLine("執行系統安全檢查");
        }
    }
/// <summary>
    /// 網銀安全子系統C
    /// </summary>
    public class NetBankSystemC
    {
        public void MethodC()
        {
            Console.WriteLine("執行網銀安全檢測");
        }
    }
高層Facade
 /// <summary>
    /// 高層的Facade
    /// </summary>
    public class SystemFacade
    {
        private AuthoriationSystemA auth;
        private SecuritySystemB security;
        private NetBankSystemC netbank;

        public SystemFacade()
        {
            auth = new AuthoriationSystemA();
            security = new SecuritySystemB();
            netbank = new NetBankSystemC();
        }

        public void Buy()
        {
            auth.MethodA();//身份認證子系統
            security.MethodB();//系統安全子系統
            netbank.MethodC();//網銀安全子系統

            Console.WriteLine("我已經成功購買了!");
        }
    }
呼叫
 /// <summary>
    /// FacadeTest 測試類
    /// </summary>
    public class FacadeTest : ITest
    {
        public void RunTest()
        {
            SystemFacade facade = new SystemFacade();
            facade.Buy();
        }
    }

image

外觀模式的優缺點

優點
  • 外觀模式對客戶遮蔽了子系統元件,從而簡化了介面,減少了客戶處理的物件數目並使子系統的使用更加簡單。
  • 外觀模式實現了子系統與客戶之間的松耦合關係,而子系統內部的功能元件是緊耦合的。松耦合使得子系統的元件變化不會影響到它的客戶
缺點
  • 如果增加新的子系統可能需要修改外觀類或客戶端的原始碼,這樣就違背了"開閉原則"

相關文章