設計模式結構型之門面模式
什麼是門面模式(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(); }
門面模式的目的就是簡化了上端的呼叫,對外隱藏了實現了細節。