美文网首页模型与算法
设计模式-外观模式

设计模式-外观模式

作者: NealLemon | 来源:发表于2019-08-07 07:38 被阅读5次

定义

又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口。

定义了一个高层接口,让子系统更容易使用。

适用场景

  • 子系统越来越复杂,增加外观模式提供简单调用接口。
  • 构建多层系统结构,利用外观对象作为每层的入口,简化层间调用。

优点

  • 简化了调用过程,无需了解深入子系统,防止带来风险。
  • 减少系统依赖,松散耦合。
  • 更好的划分访问层次。
  • 符合迪米特法则。

缺点

  • 增加子系统,扩展子系统行为容易引入风险。
    • 不符合开闭原则。

代码

我们下面来实现这么一个业务场景,在我们网上购买商品时,会有这么一个简单流程

  1. 检查是否有库存,是否可以进行购买
  2. 购买,付款
  3. 扣库存
  4. 购买成功
  5. 物流系统

我们要实现这个简单的流程需要3个服务以及一个上层接口服务。下面我们就来看一下使用外观模式下的购买流程。

检查库存服务--StockService

库存服务包括检查库存和扣除库存。

/**
 * 库存服务
 */
public class StockService {

    /**
     * 检查是否有库存
     * @param serNo  商品序列号
     * @return
     */
    public boolean haveStock(String serNo) {
        System.out.println("检查商品系列号为:" + serNo +"的商品是否有货");
        return true;
    }

    public boolean reduce(String serNo) {
        System.out.println("扣库存,商品号为:" + serNo);
        return true;
    }
}

付款服务 -- PayService

/**
 * 付款服务
 */
public class PayService {

    /**
     * 付款服务
     * @param money  付款钱数
     * @return
     */
    public boolean pay(String money) {
        System.out.println("成功支付:" + money + "元");
        return true;
    }
}

物流服务 -- DeliveryService

/**
 * 物流服务
 */
public class DeliveryService {

    public String isDelivery(String SerNo) {
        String id = "007";
        System.out.println("商品发货,订单号为:" + id);
        return id;
    }
}

上层服务(外观者模式接口服务)--ShoppingTopService

/**
 * 上层服务
 */
public class ShoppingTopService {
    private DeliveryService deliveryService;
    private PayService payService;
    private StockService stockService;
    /**
     * 模拟pring 构造注入
     */
    public ShoppingTopService() {
        this.deliveryService = new DeliveryService();
        this.payService = new PayService();
        this.stockService = new StockService();
    }

    public void buy(String serNo) {
        if(stockService.haveStock(serNo)) {   //检查库存
            if(payService.pay("10000")) { //付款
                if(stockService.reduce(serNo)) {  //扣库存
                    String deliveryId = deliveryService.isDelivery(serNo); //物流服务
                    System.out.println("交易完成,发货完成,物流号: " + deliveryId);
                }
            }
        }
    }
}

启动 -- FacadeBootStrap

public class FacadeBootStrap {

    public static void main(String[] args) {
        ShoppingTopService shoppingTopService = new ShoppingTopService();
        shoppingTopService.buy("9999");
    }
}

输出

facade.jpg

UML 类图

facadeUMl.jpg

通过类图我们可以明显看到外观模式的优点。

小结

不光是tomcat 例如Spring,Mybatis中也有很多对应的外观模式的实现。在我们阅读源码的过程中,稍加注意就可以找到。

相关文章

  • Android设计模式——外观模式(七大结构型)

    1.外观模式介绍 外观模式(Facade Pattern),是七大结构型设计模式之一。 外观模式运...

  • 设计模式[9]-外观模式-Facade Pattern

    1. 外观模式 外观模式(Facade Pattern),又称为门面模式,是非常常用的结构性设计模式。外观模式使得...

  • java设计模式-外观模式(Facade)

    外观模式,属于结构性模式。属于设计模式里面比较简单的设计模式,本人认为是最简单的设计模式。 所谓外观,就是我们能看...

  • 了解外观模式

    java 设计模式 ------外观模式 Java中一共有23种设计模式,每种设计模式各有特...

  • 设计模式之-4.外观模式

    每看一次设计模式,感觉每一个设计模式看起来是那么简单,对于外观模式我的理解就是外观模式:外观模式,这个名字起得不怎...

  • 设计模式详解——外观模式

    本篇文章介绍一种设计模式——外观模式。本篇文章内容参考《JAVA与模式》之门面模式,外观模式,深入浅出外观模式(二...

  • 外观模式(Facede)

    本文参考自: 《JAVA设计模式》之外观模式(Facade) 1. 作用 外观模式也叫门面模式,门面模式是对象的结...

  • 设计模式---外观模式

    1、外观模式(Facade):也叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个...

  • 设计模式——外观模式

    阎宏博士的《JAVA与模式》一书中开头是这样描述外观(Facade)模式的:门面模式是对象的结构模式,外部与一个子...

  • 设计模式--外观模式

    一、举个栗子小明每天回家都会先打开灯,空气净化器,电热水器烧上水,放上音乐,如果天气热的话,再打开空调。写成代码 ...

网友评论

    本文标题:设计模式-外观模式

    本文链接:https://www.haomeiwen.com/subject/mwegdctx.html