作过电商系统的小伙伴应该知道,用户购买一个东西以后,系统须要作的操做包括支付收费 、生成订单,扣除库存等几个操做。若是不使用门面模式那是怎样的呢?那咱们得分别为支付收费、生成订单,扣除库存这几个动做提供接口,让用户一个一个去调。使用门面模式就是咱们提供一个统一的接口,咱们来处理这几个动做,用户只要知道调了这个接口就能下单,购买到东西,并不须要去了解其中完成多少个步骤,有多少个子系统参与。编程
这么一说,你是否是已经一直在使用门面模式,只是你本身并无意识到你在使用它?虽然简单,也一直已经在使用,仍是有必要探究一下它的细节以及注意点。安全
定义(百度百科):门面模式,是指提供一个统一的接口去访问多个子系统的多个不一样的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。
bash
这个定义能够说是很是清晰了,基本上每一个字都认识,放在一块儿应该也能理解它的意思吧?【呵呵】markdown
要点:spa
一、提供统一的接口,用于访问多个子系统。code
涉及到的角色orm
(1)、门面类(Facade),提供一个统一的接口给客户端调用接口
(2)、各类子系统:OrderSystem、ProductSystem、PaySystem。it
代码实现以下,基本没什么可说的,直接按照UML图,编写代码便可。io
(一)、各类系统服务:订单系统、支付系统、库存系统。
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)即提供各类系统服务。
优点:
一、对客户端友好,有统一的入口提供给客户端。
二、对服务调用跟容易管理记录,也更安全。能够想象咱们提供一个购物接口确定比让客户端本身去调建立订单、减小库存、支付更安全,若是客户端忘了调某个服务,就会出现问题。
缺点:
一、门面类耦合了各类服务,较为复杂,容易出错。