美文网首页
设计模式:外观模式

设计模式:外观模式

作者: 谁家的猪 | 来源:发表于2019-08-01 08:14 被阅读0次

定义与类型

  • 定义:又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
  • 外观模式定义了一个高层接口,让子系统更容易使用
  • 类型结构型

适用场景

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

优点

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

缺点

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

相关设计模式

  • 外观模式和中介者模式
  • 外观模式和单例模式
  • 外观模式和抽象工厂模式

代码演示

实现一个积分换购礼物的功能,需要包含3个功能:资格校验,积分支付,物流配送。

  1. 创建PointsGift类
import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 积分礼物
 * @author lijiayin
 */
@Data
@AllArgsConstructor
public class PointsGift {
    private String name;
}
  1. 实现资格校验子系统
/**
 * 校验是否有资格换取礼物
 * @author lijiayin
 */
public class QualifyService {
    public boolean isAvaliable(PointsGift pointsGift){
        System.out.println("校验" + pointsGift.getName() + "积分资格通过,库存通过!");
        return true;
    }
}
  1. 实现积分支付子系统
/**
 * 支付积分
 * @author lijiayin
 */
public class PointsPaymentService {
    public boolean pay(PointsGift pointsGift){
        //扣减积分
        System.out.println("支付" + pointsGift.getName() + "积分成功");
        return true;
    }
}
  1. 实现物流配送子系统
/**
 * 物流配送
 * @author lijiayin
 */
public class ShippingService {
    public String shipGift(PointsGift pointsGift){
        //物流系统对接
        System.out.println(pointsGift.getName() + "进入物流系统");
        String shippingOrderNo = "666";
        return shippingOrderNo;
    }
}
  1. 创建一个“外观(面子)”
    由这个类暴露给外部,它定义并实现了积分兑换的流程。
/**
 * 积分兑换礼物系统
 * @author lijiayin
 */
public class GiftExchangeService {
    private QualifyService qualifyService = new QualifyService();
    private PointsPaymentService pointsPaymentService = new PointsPaymentService();
    private ShippingService shippingService = new ShippingService();
    
    public void giftExchange(PointsGift pointsGift){
        if(qualifyService.isAvaliable(pointsGift)){
            //资格校验通过
            if(pointsPaymentService.pay(pointsGift)){
                //支付成功
                String shippingOrderNo = shippingService.shipGift(pointsGift);
                System.out.println("物流系统下单成功,运单号:" + shippingOrderNo);
            }
        }
    }
}
  1. 创建测试类
/**
 * @author lijiayin
 */
public class Test {
    public static void main(String[] args) {
        PointsGift pointsGift = new PointsGift("小猪佩奇");
        GiftExchangeService giftExchangeService = new GiftExchangeService();
        giftExchangeService.giftExchange(pointsGift);
    }
}
  1. 测试结果


    测试结果.png
  2. UML图


    UML.png

框架源码示例

  1. Spring的JdbcUtils,封装了jdbc
  2. tomcat的RequestFacade和ResponseFacade

相关文章

  • 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/rlzalctx.html