Java设计模式中的门面模式详解

目录
  • 门面模式
    • 概述
    • 应用场景
    • 目的
    • 优缺点
    • 主要角色
  • 门面模式的基本使用
    • 创建子系统角色
    • 创建外观角色
    • 客户端调用
  • 门面模式实现商城下单
    • 库存系统
    • 支付系统
    • 物流系统
    • 入口系统
    • 客户端调用

门面模式

概述

门面模式(Facade Pattern)又叫外观模式,属于结构性模式。

它提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。

客户端不需要知道系统内部的复杂联系,只需定义系统的入口。即在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

应用场景

为复杂的模块或子系统提供外界访问的模块。

子系统相对独立。

预防额外操作带来的风险。

目的

降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。

优缺点

优点:

减少系统相互依赖。

提高灵活性。

提高安全性。

缺点:

不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。也就是说系统可以提供新的功能模块而不必进行修改。

主要角色

门面模式主要包含2种角色:

1.外观角色(Facade):

外观角色也称门面角色,系统对外的统一接口;

2.子系统角色(SubSystem):

可以同时有一个或多个SubSystem。每个SubSytem都不是一个单独的类,而是一个类的集合。

SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对SubSystem透明)

门面模式的基本使用

创建子系统角色

创建2个创建子系统角色:SubSystemA 与SubSystemB

public class SubSystemA {
    public void subSystem() {
        System.out.println("subSystem A");
    }
}
public class SubSystemB {
    public void subSystem() {
        System.out.println("subSystem B");
    }
}

创建外观角色

public class Facade {
    private SubSystemA a = new SubSystemA();
    private SubSystemB b = new SubSystemB();
    /**
     * 提供对外接口
     */
    public void subSystemA() {
        this.a.subSystem();
    }
    /**
     * 提供对外接口
     */
    public void subSystemB() {
        this.b.subSystem();
    }
}

客户端调用

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

门面模式实现商城下单

如商城系统中的下单,下单过程可能涉及多个模块子系统的联动操作,如果分别发送网络请求各个模块子系统的接口,会增加一定复杂度与额外的网络请求。

此时可以采取门面模式,将所有相关接口整合到一个接口中,由后端提供一个接口给前端调用。

假设在一个商城系统中,涉及库存系统、支付系统、物流系统、入口系统。用户下单时进行校验库存,验证支付,最后发货这一整个过程串联起来,提供一个统一接口供客户端调用。

库存系统

public class StockSys {
    /**
     * 库存校验
     */
    public Boolean verify(){
        if (Math.random()*10 >5) {
            System.out.println("StockSys verify success");
            return true;
        }
        System.out.println("StockSys verify fail");
        return  false;
    }
}

支付系统

public class PaySys {
    /**
     * 支付
     */
    public Boolean pay() {
        if (Math.random()*10 >2) {
            System.out.println("PaySys pay success");
            return true;
        }
        System.out.println("PaySys pay fail");
        return  false;
    }
}

物流系统

public class LogisticsSys {
    /**
     * 发货
     */
    public void ship() {
        System.out.println("logistics ship");
    }
}

入口系统

public class MySys {
    StockSys stockSys = new StockSys();
    PaySys paySys = new PaySys();
    LogisticsSys logisticsSys = new LogisticsSys();
    public void order() {
        if (stockSys.verify()) {
            if (paySys.pay()) {
                logisticsSys.ship();
            }
        }
    }
}

客户端调用

    public static void main(String[] args) {
        new MySys().order();
    }

StockSys verify success
PaySys pay success
logistics ship

StockSys verify fail

StockSys verify success
PaySys pay fail

到此这篇关于Java设计模式中的门面模式详解的文章就介绍到这了,更多相关Java门面模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-09-22

详解java设计模式中的门面模式

门面模式又叫外观模式(Facade Pattern),主要用于隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口. 我们知道电视剧操作很简单,但是里面的设计和原理很少人明白,这就是因为电视剧的设计应用了门面模式 一个电视剧至少需要有以下几个模块的功能:信号输入.音频处理.视频处理.信号输出等 /** * 射频信号输入 */ public class SignalIn { // } * 音频/视频信号输出 public class SignalOut { * 音频处理 public c

Java设计模式详解之门面模式(外观模式)

门面模式(Facade Pattern)也叫外观模式,它隐藏系统的复杂性,并向客户端提供一个可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性,为子系统中的一组接口提供了一个统一的高层访问接口,这个接口使得子系统更容易被访问或使用.这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用. 简而言之,就是把一堆复杂的流程封装成一个接口供给用户更简单的使用,这个设计模式里有三个角色: 1)门面角色( facade ):

详解PHP中的外观模式facade pattern

关于facade这个词的翻译 facade这个词,原意指的是一个建筑物的表面.外观,在建筑学中被翻译为"立面"这个术语,国内对facade这个词的关注,可能更多要依赖于laravel的流行,似乎都一致把laravel里的facade翻译作"门面".说实在的,当第一次看到翻译文档里提什么"门面"的时候,我想你跟我的内心一样:"这是在说什么玩意呢?你是在讲商店.店铺的门面吗?"直到现在,如果非得用中文说facade,非得用&quo

PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】

本文实例讲述了PHP中常用的三种设计模式.分享给大家供大家参考,具体如下: PHP中常用的三种设计模式:单例模式.工厂模式.观察者模式 1.单例模式 为何要使用PHP单例模式? 多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育". 而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有

Java设计模式之23种设计模式详解

一.什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是

Java设计模式——工厂设计模式详解

工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类. 工厂模式的形态 工厂模式主要用一下几种形态: 1:简单工厂(Simple Factory). 2:工厂方法(Factory Method). 3:抽象工厂(Abstract Factory). 简单工厂(Simple Factory) 又叫静态工厂,是工厂模式三中状态中结构最为简单的.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.我们来看一个具体的例子: 假设一家工厂,几生产洗衣

JDBC数据库连接过程及驱动加载与设计模式详解

首先要导入JDBC的jar包: 接下来,代码: Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段. JDBC连接数据库 • 创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String

详解Android更改APP语言模式的实现过程

一.效果图 二.描述 更改Android项目中的语言,这个作用于只用于此APP,不会作用于整个系统 三.解决方案 (一)布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" a

Java BigDecimal详解_动力节点Java学院整理

1.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,例如银行存款数额,这时候BigDecimal就派上大用场啦. 2.BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组

Java递归算法详解(动力节点整理)

递归算法是一种直接或者间接调用自身函数或者方法的算法.Java递归算法是基于Java语言实现的递归算法.递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解.递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解.    递归算法解决问题的特点: 1)递归就是方法里调用自身.  2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口.  3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低.所以一般不提倡用递归算法设计程序.  4)在递

Java 匿名内部类详解及实例代码

Java  匿名内部类详解 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象方法 abstract class Person { public abstract void eat(); } class Child extends Person { public void eat() { System.out.println("eat someth