设计模式结构型之门面模式


什么是门面模式(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();
        }

门面模式的目的就是简化了上端的调用,对外隐藏了实现了细节。