资讯专栏INFORMATION COLUMN

设计模式之门面模式

Chiclaim / 2052人阅读

摘要:定义与类型定义又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口外观模式定义了一个高层接口,让子系统更容易使用类型结构型类图门面模式是对系统复杂的关系处理做了一个封装,对外提供一个简单的接口,成员介绍子系统被门面模式封装的子系统

0x01.定义与类型

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

外观模式定义了一个高层接口,让子系统更容易使用

类型:结构型

UML类图

门面模式是对系统复杂的关系处理做了一个封装,对外提供一个简单的接口,成员介绍:

子系统:被门面模式封装的子系统,也是具体业务逻辑的细节

facade类:门面类,对子系统执行流程进行封装,对外开放功能接口,一般为单例对象。

0x02.适用场景

子系统越来越复杂,增加外观模式提供简单调用接口

构建多层系统结构,利用外观对象作为每层的入口,简化层间调用

0x03.优点

简化了调用过程,无需了解深入子系统,防止带来风险

减少系统依赖、松散耦合

更好的划分访问层次

符合迪米特法则,即最少知道原则

0x04.缺点

增加子系统,需要修改门面类,容易引入风险。

修改门面类,不符合开闭原则

0x05.样例代码
场景:假设积分兑换物品流程,一共有三部分别依赖三个子系统
1.积分校验系统,查看是否有资格。
2.积分支付系统,兑换礼物,扣减积分等。
3.物流系统,兑换礼物后,进行配送流程。

如果不适用门面模式,需要在客户端进行三个步骤的调用,而门面封装后只需要使用门面类,下面具体代码实现:

/**
 * 礼物实体类
 */
public class PointsGift {

    private String name;

    public PointsGift(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/**
 * 支付子系统
 */
public class PointsPaymentService {
    public boolean pay(PointsGift pointsGift) {
        //扣减积分
        System.out.println("支付:" + pointsGift.getName() + " 积分成功!");
        return true;
    }
}

/**
 * 积分校验子系统
 */
public class QualifyService {

    public boolean isAvailable (PointsGift pointsGift) {
        System.out.println("校验" + pointsGift.getName() + "积分资格通过,库存通过");
        return true;
    }
}

/**
 * 物流子系统
 */
public class ShippingService {
    public String shipGift (PointsGift pointsGift) {
        //物流系统的对接逻辑
        System.out.println(pointsGift.getName() + "进入物流系统");
        return "666";
    }
}

/**
 * 扣减积分门面类
 */
public class GiftExchangeService {

    /**
     * 模拟注入
     */
    private QualifyService qualifyService = new QualifyService();
    private PointsPaymentService pointsPaymentService = new PointsPaymentService();
    private ShippingService shippingService = new ShippingService();

    //模拟注入,一开始就已经有了三个依赖的子系统
//    public void setQualifyService(QualifyService qualifyService) {
//        this.qualifyService = qualifyService;
//    }
//
//    public void setPointsPaymentService(PointsPaymentService pointsPaymentService) {
//        this.pointsPaymentService = pointsPaymentService;
//    }
//
//    public void setShippingService(ShippingService shippingService) {
//        this.shippingService = shippingService;
//    }

    public void giftExchange (PointsGift pointsGift) {
        if (qualifyService.isAvailable(pointsGift)) {
            //资格校验通过
            if (pointsPaymentService.pay(pointsGift)) {
                //如果支付积分成功
                String shippingOrderNo = shippingService.shipGift(pointsGift);
                System.out.println("物流订单号:" + shippingOrderNo);
            }
        }
    }
}

测试与调用类

/**
 * 客户端与测试类
 */
public class Test {

    public static void main(String[] args) {
        PointsGift pointsGift = new PointsGift("连衣裙");
        GiftExchangeService giftExchangeService = new GiftExchangeService();

//        giftExchangeService.setQualifyService(new QualifyService());
//        giftExchangeService.setPointsPaymentService(new PointsPaymentService());
//        giftExchangeService.setShippingService(new ShippingService());

        giftExchangeService.giftExchange(pointsGift);
    }
}

测试输出结果:

校验连衣裙积分资格通过,库存通过
支付:连衣裙 积分成功!
连衣裙进入物流系统
物流订单号:666

样例UML

0x06.相关的设计模式

外观模式和中介者模式

外观模式关注的是外界和子系统直接的交互

中介者模式关注的是子系统之间的交互

外观模式和单例模式

外观模式中外观对象可以做成单例对象来使用

外观模式和抽象工厂模式

外观类可以通过抽象工厂获取子系统实例

子系统可以在内部对外观类进行屏蔽

0x07.源码中的外观模式

SpringJDBC中的:JdbcUtils是对JDBC的封装

MyBatis: Configuration中new开头的方法

Tomcat: RequestFacade类

Tomcat: Request类

Tomcat: ResponseFacade类

Tomcat: StandardSessionFacade类

0x08.代码地址

门面模式: https://github.com/sigmako/design-pattern/tree/master/facade

0x09.参考

慕课网设计模式精讲: https://coding.imooc.com/class/270.html

门面模式: https://www.cnblogs.com/skywang/articles/1375447.html

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75321.html

相关文章

  • Java设计模式(九)——门面模式

    摘要:门面模式提供一个高层次的接口,使得子系统更易于使用。适配器模式和门面模式区别适配器模式和门面模式区别适配器模式主要做接口转换,解决的是原接口和目标接口不匹配的问题。1、什么是门面模式?Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface...

    不知名网友 评论0 收藏0
  • 设计模式结构型

    摘要:适配器模式不应在设计阶段考虑,它是为了解决已经上线的问题的存在。组合模式将对象组合成树形结构以表示部分整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 代理模式 代理模式之前已经讲过,附上链接代理模式 装饰者模式 装饰者模式定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 装饰模式博主在第一次学习是懵逼的,是因为代理模式中代理对象和...

    Muninn 评论0 收藏0
  • 听飞狐聊JavaScript设计模式系列08

    摘要:本回内容介绍上一回聊到工厂模式,略抽象。官方说法,门面模式是指提供一个统一的接口去访问多个子系统的多个不同的接口,为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。 本回内容介绍 上一回聊到工厂模式,略抽象。介一回,咱聊门面模式就比较容易了,门面模式也叫外观模式(facade)。官方说法,门面模式是指提供一个统一的接口去访问多个子系统的多个不同的接口,为子系统中的一组接...

    saucxs 评论0 收藏0
  • 【编程课堂】php设计模式(二):结构型模式(续)

    摘要:能够协调调用者和被调用者,能够在一定程度上降低系统的耦合性。特点低耦合性,独立性好,安全性应用客户访问不到或者被访问者希望隐藏自己,所以通过代理来访问自己。 我们接着上面的几种模式继续讲: 4、组合模式 将对象组合成树形结构表示部分-整体的层次结构。 特点:灵活性强 应用:对象的部分-整体的层次结构,模糊组合对象和简单对象处理问题 代码实现 /** 组合模式* *///继承模式clas...

    Nekron 评论0 收藏0
  • JavaScript 设计模式读书笔记(六)——门面模式

    摘要:简单的门面模式实例事件绑定函数门面模式的作用是将复杂的接口进行包装,变成一个便于使用的接口。还是以事件相关为例,事件绑定中还有两个常用的分别是和。 门面模式是什么,与其我去用笨拙的语言去解释,不如看下面这张图,曾经在网上很火的一张图片,说的是一位儿子为他的爸妈设置的电脑桌面。 showImg(http://segmentfault.com/img/bVcgHm); 有了这些起好名字...

    pubdreamcc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<