当前位置: 首页 > news >正文

门面设计模式

介绍

Java门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,隐藏了复杂系统的实现细节,使得客户端可以更加容易地使用系统.

在Java门面模式中,一个门面对象(Facade)提供了一个简单的接口,该接口包装了一个或多个复杂的子系统,客户端可以直接使用门面对象来访问子系统,而无需直接与子系统交互,门面对象将客户端的请求转发到适当的子系统对象,然后将子系统对象的响应返回给客户端.这样,客户端就不需要知道子系统内部的细节,也不需要与多个子系统对象进行交互,从而降低了系统的复杂性和耦合性.

门面模式有以下两种角色:

  1. 门面(Facade)角色:门面角色是整个门面模式的核心,它提供了一个简单的接口,隐藏了系统的复杂性.门面角色知道将客户端请求发送给那些子系统对象,如何将这些请求转发给子系统对象,以及如何将子系统对象的响应返回给客户端.
  2. 子系统(Subsystem)角色:子系统角色是实现系统功能的各个部分.子系统角色是与门面角色相对应的,它们是门面角色所封装的具体功能实现.子系统角色处理门面角色传递过来的请求,并返回处理结果.

实现

假设有一个在线购物系统,其中包含了库存管理,订单管理和支付管理等多个子系统.现在需要对这些子系统进行封装,提供了一个简单的接口给客户端使用.这时就可以使用Java门面模式来实现.

首先定义一个订单类

@Data
public class Order {private String itemId;private int quantity;public Order(String itemId, int quantity) {this.itemId = itemId;this.quantity = quantity;}
}

然后定义子系统角色

public class InventoryManagement {/*** 检查库存** @param itemId* @param quantity* @return*/public boolean checkInventory(String itemId, int quantity) {System.out.println("检查库存");return true;}
}public class OrderManagement {/*** 创建订单** @param itemId* @param quanitity* @return*/public Order createOrder(String itemId, int quanitity) {System.out.println("创建订单");return new Order(itemId, quanitity);}
}public class PaymentManagement {/*** 支付订单** @param order* @param paymentMethod*/public void makePayment(Order order, String paymentMethod) {System.out.println("支付订单");}
}

最后定义门面类,作为整个门面模式的核心

public class OnlineShoppingFacade {private InventoryManagement inventoryManagement;private OrderManagement orderManagement;private PaymentManagement paymentManagement;public OnlineShoppingFacade(InventoryManagement inventoryManagement, OrderManagement orderManagement, PaymentManagement paymentManagement) {this.inventoryManagement = inventoryManagement;this.orderManagement = orderManagement;this.paymentManagement = paymentManagement;}/*** 下单操作** @param itemId* @param quantity* @param paymentMenthod*/public void placeOrder(String itemId, int quantity, String paymentMenthod) {System.out.println("开始处理下单操作...");boolean checkInventory = inventoryManagement.checkInventory(itemId, quantity);if (!checkInventory) {throw new RuntimeException("库存不足");}Order order = orderManagement.createOrder(itemId, quantity);paymentManagement.makePayment(order, paymentMenthod);}
}

测试

public class Demo {public static void main(String[] args) {OnlineShoppingFacade onlineShoppingFaced = new OnlineShoppingFacade(new InventoryManagement(),new OrderManagement(),new PaymentManagement());onlineShoppingFaced.placeOrder("123",3,"Wechat");}
}

在这里插入图片描述

在这个示例中,我们创建了一个门面类OnlineShoppingFacade,该门面类封装了库存管理,订单管理和支付管理三个子系统对象.客户端只需要使用OnlineShoppingFacade类提供得placeOrder()方法,就可以完成下单操作.通过这种方式,我们将整个下单过程封装在OnlineShoppingFacade门面类中,使得客户端无需了解底层子系统对象得实现细节,只需要调用门面类提供得方法即可完成操作.这样,我们就实现了一个简单的Java门面示例.

总结

优点

  • 简化客户端代码:门面模式可以隐藏底层子系统对象的实现细节,使得客户端只需要调用门面类提供的方法即可完成操作,从而简化了客户端代码的复杂度.
  • 解耦合:门面模式可以将客户端与底层子系统对象解耦合,从而使得底层子系统对象的修改对客户端代码的影响降到最低.
  • 提高安全性:门面模式可以将一些敏感操作封装起来,只允许客户端通过门面类进行访问,从而提高了安全性.

缺点

  • 可能增加系统复杂度:如果门面类实现不当,可能会增加系统复杂度.
  • 可能降低灵活性:如果需要新增子系统对象或修改子系统对象的实现细节,可能需要修改门面类的代码,从而降低了系统的灵活性.

应用场景

  • 当一个系统包含多个子系统,可客户端需要使用这些子系统完成某个操作时,可以考虑使用门面模式封装这些子系统.
  • 当客户端需要调用一些敏感的操作时,可以使用门面模式将这些操作封装起来,从而提高系统的安全性,
  • 当客户端需要使用多个复杂的子系统对象完成某个操作时,可以使用门面模式简化客户端的代码复杂度.

总之,Java门面模式适用于那些需要将复杂系统拆分成多个子系统对象,并将这些子系统对象封装起来以简化客户端的代码复杂度和提高系统的安全性的情况.

相关文章:

门面设计模式

介绍 Java门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,隐藏了复杂系统的实现细节,使得客户端可以更加容易地使用系统. 在Java门面模式中,一个门面对象(Facade)提供了一个简单的接口,该接口包装了一个或多个复杂的子系统,客户端可以直接使用门面对象…...

苹果手写笔好用吗?比较好用的ipad手写笔推荐

随着技术的进步,各种新型的电子产品和数码器件层出不穷。比如智能手机、IPAD、以及电容笔。而在实际生活中,为了更好的利用ipad,我们需要一支好用的电容笔。就好比如我们在ipad上做笔记,要用手来进行手写记录,会很不方…...

GPT-4来了!看看她究竟强在哪里!

GPT-4来了!OpenAI老板Sam Altman直接开门见山地介绍说:这是我们迄今为止功能最强大的模型!GPT-4是一个超大的多模态模型,也就是说,它的输入可以是文字(上限2.5万字),还可以是图像。我…...

GPT-4 API 接口调用及价格分析

GPT-4 API 接口调用及价格分析 15日凌晨,OpenAI发布了万众期待的GPT-4!新模型支持多模态,具备强大的识图能力,并且推理能力和回答准确性显著提高。在各种专业和学术基准测试上的表现都媲美甚至超过人类。难怪OpenAI CEO Sam Altm…...

MySQL高级功能:存储过程、触发器、事务、备份和恢复

MySQL高级功能MySQL是一款广泛使用的关系型数据库管理系统,它不仅具有基本的数据库功能,还支持一些高级功能,如存储过程、触发器、事务、备份和恢复等。这些高级功能可以帮助开发人员更高效地管理和维护数据库,本文将介绍MySQL的高…...

SAP 发出商品业务配置

SAP发出商品业务配置,即: 出具销售发票时结转成本 一、业务背景: 发出商品业务简单的理解为跨月开票,即出库与开票不在同一个月份。 该业务在系统内的实现方式,为保证成本与收入的配比,在出库时不计算成…...

C++线程池理解

线程池基本信息 线程池是一种结合池化思想衍生出来的一种线程管理及使用的方案 其主要针对服务器端多线程场景下,服务器频繁接收请求,每个请求都分配一个单独的线程去处理。 使用线程的开销: 创建和销毁线程调度线程 线程池主要解决的核…...

2023年最新软著申请流程(一):软件著作权说明、国家版权官网的账号注册与实名认证

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/129230460 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…...

SuperMap iServer如何发布S3对象存储中的瓦片

作者:Carlo 前言: S3 对象存储服务是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力。其海量、安全的特性,为存储海量瓦片提供可能。 SuperMap iServer 支持将存储在阿里云对象存储 (OSS)、华为…...

ElasticSearch-第四天

目录 ElasticSearch文档分值_score计算底层原理 relevance score算法 Term frequency Inverse document frequency Field-length norm 分析一个document上的_score是如何被计算出来的 分词器工作流程 切分词语 内置分词器的介绍 定制分词器 ik分词器详解 IK分词器自…...

基于鲸鱼算法的极限学习机(ELM)分类算法-附代码

基于鲸鱼算法的极限学习机(ELM)分类算法 文章目录基于鲸鱼算法的极限学习机(ELM)分类算法1.极限学习机原理概述2.ELM学习算法3.分类问题4.基于鲸鱼算法优化的ELM5.测试结果6.参考文献7.Matlab代码摘要:本文利用鲸鱼算法对极限学习机进行优化,并用于分类问…...

一文彻底读懂webpack常用配置

开发环境 const webpack require("webpack"); const path require(path) module.exports {// entry: {// a: ./src/0706/a.js,// c: ./src/0706/c.js,// },entry: "./src/0707/reactDemo.js",output: {filename: [name]_dist.js,path: path.resolve(__…...

大环境不好,找工作太难?三面阿里,幸好做足了准备,已拿offer

三面大概九十分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜)。回来之后把这些题目做了一个分类并整理出答案(强迫症的我狂补知识)分为软件测试基础、Python自动化…...

C++ 手撸简易服务器(完善版本)

本文没有带反射部分内容&#xff0c;可以看我之前发的 Server.h #pragma once#include <string> #include <iostream> #include <thread> #include <unordered_map> using namespace std; #ifndef _SERVER_ #define _SERVER_#include <winsock.h&…...

【Python入门第三十四天】Python丨文件处理

文件处理是任何 Web 应用程序的重要组成部分。 Python 有几个用于创建、读取、更新和删除文件的函数。 文件处理 在 Python 中使用文件的关键函数是 open() 函数。 open() 函数有两个参数&#xff1a;文件名和模式。 对于刚学Python的小伙伴&#xff0c;我给大家准备了2023…...

【Linux】写一个基础的bash

头文件#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/wait.h> #include<sys/stat.h> #include<string.h> #include<pwd.h> #include<dirent.h>分割输入的命令串字符串或参数内容为空则退出strtok( ,…...

图解如何一步步连接远程服务器——基于VScode

基于VScode连接远程服务器 安装Remote-SSH等插件 想要在vscode上连接远程服务器需要下载Remote-SSH系列插件&#xff1a; 直接在插件中搜索remote&#xff0c;即可找到&#xff0c;选择图片中的3个插件&#xff0c;点击install安装。 配置Remote-SSH 在这个步骤有多种操作…...

element - - - - - 你不知道的loading使用方式

求人不如求己 你不知道的loading使用方式1. 指令方式使用1.1 默认loading1.2 自定义loading1.3 整页加载2. 服务方式使用2.1 this.$loading的使用2.2 Loading.service的使用关于页面交互&#xff0c;最害怕的就是接口等待时间太长&#xff0c;用户体验不好。 而如何提高用户体…...

C++程序调用IsBadReadPtr或IsBadWritePtr引发内存访问违例问题的排查

目录 1、问题描述 2、VS中看不到有效的信息,尝试使用Windbg去分析 3、使用Windbg分析 4、最后...

IntelliJIDEA 常用快捷键

IntelliJIDEA 常用快捷键 Alt Enter 导入包&#xff0c;自动修正&#xff0c;自动创建变量名。 Ctrl Alt O 优化导入的类和包 Ctrl / 单行注释 (//) Ctrl Shift / 多行注释 (/* … */) 方法或类说明注释&#xff08;文档注释&#xff09; 在一个方法或类的开头&#xf…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...