1. 程式人生 > 實用技巧 >設計模式結構型之門面模式

設計模式結構型之門面模式

什麼是門面模式(facade pattern)?

舉個生活中的例子,我門去肯德基買漢堡套餐,只要去找櫃檯的工作人員點個餐就可以了,然後由後臺工作人員給我們配餐,而不是需要我們自己去廚房自己去拿各種東西。那麼櫃檯就相當於是充當了門面的角色。至於漢堡,雞腿是怎麼來的,我們不用關心。

在程式開發中門面模式很像我門設計模式六大原則中的迪米特法則。下面再複習一下設計模式的六大原則。

設計模式6大原則五大原則(SOLID)

1).單一職責原則(SRP)

    一個類,一個方法只負責一件事。簡單意味著穩定,意味著強大。

2).里氏替換原則(LSP)

    子類應當可以替換父類並出現在父類能夠出現的任何地方。父類出現的東西,子類必須有,如果沒有就應該斷掉繼承,應該再新增一個父類。指導我們如何用好繼承。

3).依賴倒置原則(DIP)

    高層對低層的依賴,應該依賴與抽象,而不是依賴細節。面向抽象程式設計。

4).介面隔離原則(ISP)

    使用多個專門的介面,而不使用單一的總介面,即客戶端不應該依賴那些它不需要的介面。

5).迪米特法則(LOD)

    迪米特法則(Law of Demeter )又叫做最少知識原則,也就是說,一個物件應當對其他物件儘可能少的瞭解。不和陌生人說話。英文簡寫為: LoD。

6).開閉原則(OCP)

    開閉原則(Open-Closed Principle, OCP):一個軟體實體應當對擴充套件開放,對修改關閉。即軟體實體應儘量在不修改原有程式碼的情況下進行擴充套件。

程式中有哪些應用場景呢,比如我們在提交訂單的時候會寫一些業務邏輯,客戶下單時,用了會員卡上的餘額,用了優惠券,我們可能常常會這樣用。

        static void Main(string[] args)
        {
            OrderBll order = new OrderBll();
            CustomerBll customer = new CustomerBll();
            CouponBll coupon = new CouponBll() ;

            //訂單是否存在
            if
(!order.CheckOrder()) { order.CreateOrder(); //提交訂單 } //客戶是否存在,餘額是否充足 if (customer.CheckCustomer(1)) { customer.UpdateCustmer();//修改餘額 } //優惠券是否可用 if (coupon.CheckCoupon(11)) { coupon.UpdateCoupon();//修改優惠券 } }

這樣我們上端呼叫時出現了太多細節,於是我們要用門面模式進行一次封裝。

    /// <summary>
    /// 門面類
    /// </summary>
    public class FacadeOrderService
    {
        public void CreateOrder()
        {
            OrderBll order = new OrderBll();
            CustomerBll customer = new CustomerBll();
            CouponBll coupon = new CouponBll();

            //訂單是否存在
            if (!order.CheckOrder())
            {
                order.CreateOrder(); //提交訂單
            }
            //客戶是否存在,餘額是否充足
            if (customer.CheckCustomer(1))
            {
                customer.UpdateCustmer();//修改餘額
            }

            //優惠券是否可用
            if (coupon.CheckCoupon(11))
            {
                coupon.UpdateCoupon();//修改優惠券
            }
        }
        static void Main(string[] args)
        {
            //上端呼叫
            FacadeOrderService orderService = new FacadeOrderService();
            orderService.CreateOrder();
        }

門面模式的目的就是簡化了上端的呼叫,對外隱藏了實現了細節。