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

Java设计模式之外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式通过隐藏子系统的复杂性,简化了客户端与子系统之间的交互,提供了一个更简单、更直观的接口。

外观模式由以下几个角色组成:

  1. 外观(Facade):外观对象是客户端与子系统之间的接口。它封装了对子系统的调用,将客户端的请求委派给适当的子系统对象进行处理。
  2. 子系统(Subsystems):子系统是一组类或对象,实现了子系统的功能。外观对象将客户端的请求转发给子系统进行处理。

下面是一个简单的示例,说明外观模式的使用:

假设有一个电子商务平台,包含了订单管理、库存管理和支付管理等子系统。每个子系统都有一些复杂的逻辑和接口。为了简化客户端与这些子系统之间的交互,我们可以使用外观模式。

首先,我们定义一个外观类 OnlineStoreFacade,它包含了订单管理、库存管理和支付管理的接口方法。

// 外观类
public class OnlineStoreFacade {private OrderManager orderManager;private InventoryManager inventoryManager;private PaymentManager paymentManager;public OnlineStoreFacade() {orderManager = new OrderManager();inventoryManager = new InventoryManager();paymentManager = new PaymentManager();}public void placeOrder(String productId, int quantity) {// 调用订单管理子系统orderManager.createOrder(productId, quantity);// 调用库存管理子系统inventoryManager.updateInventory(productId, quantity);// 调用支付管理子系统paymentManager.processPayment(productId, quantity);}
}

然后,我们定义订单管理、库存管理和支付管理的子系统类。

// 订单管理子系统
public class OrderManager {public void createOrder(String productId, int quantity) {// 实现创建订单的逻辑System.out.println("创建订单:" + productId + ", 数量:" + quantity);}
}// 库存管理子系统
public class InventoryManager {public void updateInventory(String productId, int quantity) {// 实现更新库存的逻辑System.out.println("更新库存:" + productId + ", 数量:" + quantity);}
}// 支付管理子系统
public class PaymentManager {public void processPayment(String productId, int quantity) {// 实现支付处理的逻辑System.out.println("处理支付:" + productId + ", 数量:" + quantity);}
}

最后,我们可以通过外观类 OnlineStoreFacade 来简化客户端与子系统之间的交互:

public class Client {public static void main(String[] args) {OnlineStoreFacade facade = new OnlineStoreFacade();facade.placeOrder("ABC123", 2);}
}

在上述示例中,客户端只需要与外观类 OnlineStoreFacade 进行交互,而不需要了解订单管理、库存管理和支付管理的具体实现细节。外观类将客户端的请求委派给适当的子系统进行处理,从而简化了客户端的代码。

相关文章:

Java设计模式之外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式通过隐藏子系统的复杂性,简化了客户端与子系统之间的交互,提供了一个更简单、更直观的接口。…...

【大疆智图】大疆智图(DJI Terra 3.0.0)安装及使用教程

大疆智图是一款以二维正射影像与三维模型重建为主的软件,同时提供二维多光谱重建、激光雷达点云处理、精细化巡检等功能。它能够将无人机采集的数据可视化,实时生成高精度、高质量三维模型,满足事故现场、工程监测、电力巡线等场景的展示与精确测量需求。 文章目录 1. 安装D…...

腾讯地图基本使用(撒点位,点位点击,弹框等...功能) 搭配Vue3

腾讯地图的基础注册账号 展示地图等基础功能在专栏的上一篇内容 大家有兴趣可以去看一看 今天说的是腾讯地图的在稍微一点的基础操作 话不多说 直接上代码 var marker ref(null) var map var center ref(null) // 地图初始化 const initMap () > {//定义地图中心点坐标…...

散列表:Word文档中的单词拼写检查功能是如何实现的?

文章来源于极客时间前google工程师−王争专栏。 一旦我们在Word里输入一个错误的英文单词,它就会用标红的方式提示“编写错误”。Word的这个单词拼写检查功能,虽然很小但却非常实用。这个功能是如何实现的? 散列别(Hash Table&am…...

智慧公厕蜕变多功能城市智慧驿站公厕的创新

随着城市发展的不断推进,对公共设施的便利性和智能化要求也日益提高。为满足市民对高品质、便捷、舒适的公共厕所的需求,智慧公厕行业的领航厂家广州中期科技有限公司,全新推出了一体化智慧公厕驿站。凭借着“高科技碳中和物联网创意设计新经…...

R语言清洗与处理数据常用代码段

去掉数据框df的某一列&#xff1a; # 删除不必要的变量 data$unnecessary_var <- NULL 选择需要的列进行读入数据框&#xff1a; # 选择需要的列 selected_cols <- c("col1", "col2", "col3") data <- fread("data.csv", s…...

centos 7.9 安装python 3.10的tls问题,

本地开发升级成了py3.10.6,服务器测试时安装py3.10.4 发现无法正常使用pip3 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 印象中py3的高版本依赖高版本的openssl,centos 7下默认的openssl为1.0.x, 问题很简…...

pytorch,tf维度理解RNN

input_t input_t.squeeze(1) 这行代码用于从 input_t 中去除尺寸为1的维度。在深度学习中&#xff0c;经常会出现具有额外尺寸为1的维度&#xff0c;这些维度通常是为了匹配模型的期望输入维度而添加的。 在这里&#xff0c;input_t可能具有形状 (batch_size, 1, feature_dim…...

算法刷题-数组

算法刷题 209. 长度最小的子数组-二分或者滑动窗口 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度**。**如果不存在符合条件的子数…...

可视化数学分析软件 MATLAB R2021b mac中文版软件介绍

MATLAB R2021b mac作为数学类科技应用软件中首屈一指的商业数学软件&#xff0c;可以帮助您进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。…...

罗技摄像头左右翻转

需要下载驱动lws&#xff08;我的是c310&#xff09; LWS 罗技摄像头驱动下载 打开驱动程序&#xff0c;高级设置。有个镜像。...

【Linux】操作系统的认识

操作系统 1. 冯诺依曼体系结构2. 操作系统 1. 冯诺依曼体系结构 冯诺依曼体系结构的介绍 冯.诺依曼结构消除了原始计算机体系中&#xff0c;只能依靠硬件控制程序的状况&#xff08;程序作为控制器的一部分&#xff0c;作为硬件存在&#xff09;&#xff0c;将程序编码存储在…...

【论文阅读】(2023TPAMI)PCRLv2

目录 AbstractMethodMethodnsU-Net中的特征金字塔多尺度像素恢复多尺度特征比较从多剪切到下剪切训练目标 总结 Abstract 现有方法及其缺点&#xff1a;最近的SSL方法大多是对比学习方法&#xff0c;它的目标是通过比较不同图像视图来保留潜在表示中的不变合判别语义&#xff…...

大数据学习(17)-mapreduce task详解

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…...

HCIA --- DHCP服务、路由器、网络部署及基本配置

带宽计算公式&#xff1a; 速率 约等于 (带宽/8)*85% 网线分类&#xff1a; RJ-45双绞线 非屏蔽线 最佳距离100M&#xff1b; 民用 1000M/S 商用100000M/S 数字 光纤 光信号 RJ-11 电话线 模拟信号 同轴电缆 数字信号 光信号 数字信号--二进制 …...

手把手入门Node框架Egg.js

0.介绍 Egg.js 是一个面向企业级应用开发的 Node.js 框架&#xff0c;它建立在 Koa.js 之上&#xff0c;提供了一种更简单、灵活的开发方式。Egg.js 提供了一些默认约定和最佳实践&#xff0c;可以帮助开发者快速构建可靠、可扩展的应用程序。 基于 Koa.js&#xff1a;Egg.js …...

百度智能云推出,国内首个大模型全链路生态支持体系

在10月17日举行的百度世界2023上&#xff0c;百度智能云宣布&#xff0c;百度智能云千帆大模型服务平台已服务17000多家客户&#xff0c;覆盖近500个场景。 同时&#xff0c;新的企业和开发者还正在不断地涌入千帆&#xff0c;大模型调用量高速攀升。平台上既有年龄仅14岁的小…...

CUDA学习笔记(八)Branch Divergence and Unrolling Loop

Avoiding Branch Divergence 有时&#xff0c;控制流依赖于thread索引。同一个warp中&#xff0c;一个条件分支可能导致很差的性能。通过重新组织数据获取模式可以减少或避免warp divergence&#xff08;该问题的解释请查看warp解析篇&#xff09;。 The Parallel Reduction …...

Android MQTT连接阿里云使用Json解析数据

Android Studio 连接阿里云订阅主题然后使用JSON解析数据非常好用 导入MQTT的JAR包1、在项目中添加依赖然后使用Studio 去下载库2、直接下载JAR包&#xff0c;然后作为库进行导入 环境验证&#xff1a;给程序进行联网权限XML布局文件效果如下&#xff1a; MainActitive.java 主…...

生成二维码

Qt本地生成二维码-第三方库Libqrencode Chapter1 Qt本地生成二维码-第三方库Libqrencode一、功能简介二、本地生成二维码三、在线生成二维码 Chapter2 Qt生成二维码图片方法QRCode二维码简介如何选定QR码版本&#xff1f;主要方法(1) 下载qrencode源码(2) 将qrencode源码移植到…...

STM32H743 FDCAN接收中断实战:从CubeMX配置到串口打印数据的完整流程

STM32H743 FDCAN接收中断实战&#xff1a;从CubeMX配置到串口打印数据的完整流程 在嵌入式开发中&#xff0c;CAN总线通信因其高可靠性和实时性被广泛应用于汽车电子、工业控制等领域。STM32H743作为STMicroelectronics推出的高性能微控制器系列&#xff0c;其内置的FDCAN&…...

抖音无水印下载工具:从零开始构建你的专属视频素材库

抖音无水印下载工具&#xff1a;从零开始构建你的专属视频素材库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...

从零开始:Docker部署Qwen2.5-7B-Instruct大模型,解决环境配置难题

从零开始&#xff1a;Docker部署Qwen2.5-7B-Instruct大模型&#xff0c;解决环境配置难题 1. 引言 在当今AI技术快速发展的时代&#xff0c;大型语言模型已成为技术创新的重要驱动力。Qwen2.5-7B-Instruct作为通义千问团队最新推出的指令微调模型&#xff0c;在知识量、编程能…...

第30篇:AI辅助法律与合同审查——降低中小企业风险的成本利器(项目实战)

文章目录项目背景技术选型架构设计核心实现踩坑记录效果对比项目背景 在上一轮创业时&#xff0c;我吃过合同的亏。一份看似标准的采购协议&#xff0c;因为一个模糊的“验收标准”条款&#xff0c;导致交付后与供应商扯皮了近三个月&#xff0c;最终以我们承担额外成本告终。…...

Gemma-3-12b-it部署教程:bf16精度加载失败排查与CUDA版本兼容清单

Gemma-3-12b-it部署教程&#xff1a;bf16精度加载失败排查与CUDA版本兼容清单 1. 项目概述 Gemma-3-12b-it是基于Google Gemma-3-12b-it大模型开发的本地多模态交互工具&#xff0c;专为图文混合交互场景优化。该工具通过多项技术创新解决了12B大模型在本地部署中的性能瓶颈&…...

Java八股之JDK1.8 的新特性

JDK1.8 的新特性以下是除去 CompletableFuture、重复注解和接口默认方法之外的 JDK 1.8 的新特性&#xff0c;并附上一些参考代码案例&#xff1a;1. Lambda 表达式Lambda 允许在 Java 中更简洁地使用函数式编程风格。它提供了一种简洁的方式来表示匿名函数&#xff0c;并使代码…...

Claude Code 官方安装指南(智谱AI配置)

Claude Code 官方安装指南&#xff08;智谱AI配置&#xff09; 概述 本文档介绍如何安装官方Claude Code CLI工具&#xff0c;并配置为使用智谱AI的GLM模型API。 前置要求 Node.js 18 (建议使用nvm管理)智谱AI API Key 安装步骤 1. 获取智谱AI API Key 访问 智谱AI开放平…...

C#怎么实现WPF MVVM框架 C#如何用CommunityToolkit.Mvvm快速搭建WPF MVVM项目【框架】

CommunityToolkit.Mvvm 通过 ObservableObject 和源生成器编译期注入 INotifyPropertyChanged 逻辑&#xff0c;避免手写漏通知、拼错名等问题&#xff1b;需严格匹配字段与属性名、禁用构造函数中 SetProperty、用泛型重载支持自定义通知&#xff1b;RelayCommand 需显式传 ca…...

从Copilot到CodeSynergy:如何用4步构建企业级生成-推荐双引擎,提升IDE采纳率3.8倍?

第一章&#xff1a;从Copilot到CodeSynergy&#xff1a;生成与推荐融合的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 传统AI编程助手如GitHub Copilot&#xff0c;本质上是单向生成模型——基于上下文预测下一行代码&#xff0c;缺乏对开发者意图、项目约束与协作…...

Redis如何在应用启动时预热缓存数据

不可靠。应用启动时直接调用 redis-cli 或客户端批量写入易因 Redis 未就绪、网络不通、认证失败等导致失败&#xff0c;且缺乏重试、超时、幂等控制&#xff1b;应优先在应用层用客户端实现预热&#xff0c;并做好健康检查、分批写入与内存管控。应用启动时调用 redis-cli 或客…...