设计模式之门面模式

539 阅读3分钟

       做过电商系统的小伙伴应该知道,用户购买一个东西之后,系统需要做的操作包括支付收费 、生成订单,扣除库存等几个操作。如果不使用门面模式那是怎样的呢?那我们得分别为支付收费、生成订单,扣除库存这几个动作提供接口,让用户一个一个去调。使用门面模式就是我们提供一个统一的接口,我们来处理这几个动作,用户只要知道调了这个接口就能下单,购买到东西,并不需要去了解其中完成多少个步骤,有多少个子系统参与。

       这么一说,你是不是已经一直在使用门面模式,只是你自己并没有意识到你在使用它?虽然简单,也一直已经在使用,还是有必要探究一下它的细节以及注意点。

一、定义

定义(百度百科):门面模式,是指提供一个统一的接口访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。

这个定义可以说是非常清晰了,基本上每个字都认识,放在一起应该也能理解它的意思吧?【呵呵】

要点:

1、提供统一的接口,用于访问多个子系统。

二、UML

涉及到的角色

(1)、门面类(Facade),提供一个统一的接口给客户端调用

(2)、各种子系统:OrderSystem、ProductSystem、PaySystem。


三、实例

代码实现如下,基本没什么可说的,直接按照UML图,编写代码即可。

(一)、各种系统服务:订单系统、支付系统、库存系统。

package com.facade;

public class OrderSystem {

    public void createOrder(){
        System.out.println("创建一个新的订单!!!");
    }

}

package com.facade;

public class PaySystem {

    public void pay(){
        System.out.println("支付:支付完成!!!");
    }
}

package com.facade;

public class ProductSystem {

    public void deProductCount(){
        System.out.println("扣减库存!!!");
    }
}

(二)、门面类,提供一个统一的入口,让客户端调用

package com.facade;

public class Facade {

    private PaySystem paySystem;
    private OrderSystem orderSystem;
    private ProductSystem productSystem;

    public Facade(){
        paySystem = new PaySystem();
        orderSystem = new OrderSystem();
        productSystem = new ProductSystem();
    }

    public void buyABook(){
        paySystem.pay();
        orderSystem.createOrder();
        productSystem.deProductCount();
    }

}

(三)、调用

package com.facade;

public class TestMain {

    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.buyABook();
    }
}

(四)、执行结果


四、结论

门面模式(外观模式):提供一个统一接口,集中多个子系统,多个接口方法,提供服务。如编程中MVC模式,C(Controller)即为门面,提供统一入口、M(Model)即提供各种系统服务。

优势:

1、对客户端友好,有统一的入口提供给客户端。

2、对服务调用跟容易管理记录,也更安全。可以想象我们提供一个购物接口肯定比让客户端自己去调创建订单、减少库存、支付更安全,如果客户端忘了调某个服务,就会出现问题。

缺点:

1、门面类耦合了各种服务,较为复杂,容易出错。