设计模式结构型之门面模式
什么是门面模式(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();//修改优惠券 } }
这样我们上端调用时出现了太多细节,于是我们要用门面模式进行一次封装。
////// 门面类 /// 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(); }
门面模式的目的就是简化了上端的调用,对外隐藏了实现了细节。