• 结构性设计模式之门面模式


    门面模式

    概述

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

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

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

    应用场景

    为复杂的模块或子系统提供外界访问的模块。
    
    子系统相对独立。 
    
    预防额外操作带来的风险。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    目的

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

    优缺点

    优点:

    减少系统相互依赖。 
    
    提高灵活性。 
    
    提高安全性。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    缺点:

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

    主要角色

    门面模式主要包含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");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    public class SubSystemB {
        public void subSystem() {
            System.out.println("subSystem B");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建外观角色

    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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    客户端调用

        public static void main(String[] args) {
            Facade facade = new Facade();
            facade.subSystemA();
            facade.subSystemB();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    门面模式实现商城下单

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

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

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

    库存系统

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    支付系统

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    物流系统

    public class LogisticsSys {
        /**
         * 发货
         */
        public void ship() {
            System.out.println("logistics ship");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    入口系统

    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();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    客户端调用

        public static void main(String[] args) {
            new MySys().order();
        }
    
    • 1
    • 2
    • 3
    StockSys verify success
    PaySys pay success
    logistics ship
    
    StockSys verify fail
    
    StockSys verify success
    PaySys pay fail
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    MOOC——信号报告(5分)
    C#值类型设置为null
    计算机组成原理学习笔记:计算机系统的层次结构
    布局云与边缘之后,Akamai 为何加码安全领域
    C++学习day--23 枚举、类型定义、头文件
    基于FPGA的一维卷积神经网络CNN的实现(八)激活层实现
    shell脚本的函数
    day49 jdbc技术
    系统架构设计:20 论软件需求管理
    学了labview怎么系统的编一个程序?
  • 原文地址:https://blog.csdn.net/qq_38628046/article/details/115601038