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

23种设计模式 - 空对象模式

模式定义

空对象模式(Null Object Pattern)是一种行为型设计模式,通过用无操作的空对象替代null值,消除客户端对空值的检查,避免空指针异常。其核心是让空对象与真实对象实现相同接口,但空对象不执行实际逻辑。


模式结构

抽象对象(Abstract Object)

  • 定义所有对象的统一接口(如Tool类中的use()方法)。
    真实对象(Real Object)
  • 实现具体功能(如DrillTool钻孔操作)。
    空对象(Null Object)
  • 实现相同接口但无实际操作(如NullTool静默处理调用)。

适用场景

数控系统工具管理:未安装工具时返回空工具对象。
避免空值检查:如数据库查询未找到记录时返回空实体。
简化客户端逻辑:无需判断对象是否为null


C++示例(数控系统工具切换)

场景说明:
数控机床切换工具时,若未安装工具则返回空对象,避免空指针异常。

#include 
#include // 抽象工具接口
class Tool {
public:virtual void use() = 0;virtual ~Tool() = default;
};// 真实对象:钻孔工具
class DrillTool : public Tool {
public:void use() override {std::cout << "钻孔工具启动:开始钻孔操作\n";}
};// 真实对象:切割工具
class CuttingTool : public Tool {
public:void use() override {std::cout << "切割工具启动:开始切割操作\n";}
};// 空对象:未安装工具
class NullTool : public Tool {
public:void use() override {// 空操作,不输出任何内容}
};// 工具工厂类
class ToolFactory {
public:static std::shared_ptr getTool(int toolId) {switch (toolId) {case 1: return std::make_shared();case 2: return std::make_shared();default: return std::make_shared(); // 无效ID返回空对象}}
};// 客户端代码(数控系统操作)
int main() {// 模拟工具切换(假设当前未安装工具,ID=0)auto tool = ToolFactory::getTool(0);tool->use(); // 安全调用,无空指针风险// 安装钻孔工具(ID=1)tool = ToolFactory::getTool(1);tool->use();return 0;
}

代码解释
抽象接口Tool

  • 定义use()方法,强制所有工具实现统一操作。
    真实工具类:
  • DrillToolCuttingTool实现具体功能(钻孔、切割)。
    空对象NullTool
  • 重写use()但不执行任何操作,避免客户端因未安装工具而崩溃。
    工厂类ToolFactory
  • 根据工具ID返回真实对象或空对象,隐藏空值判断逻辑。

优势与引用来源

消除空检查:客户端无需判断if (tool != nullptr)
增强健壮性:空对象提供无害默认行为,防止程序崩溃。
代码简洁性:逻辑集中于工厂类,客户端调用更简洁。

相关文章:

23种设计模式 - 空对象模式

模式定义 空对象模式&#xff08;Null Object Pattern&#xff09;是一种行为型设计模式&#xff0c;通过用无操作的空对象替代null值&#xff0c;消除客户端对空值的检查&#xff0c;避免空指针异常。其核心是让空对象与真实对象实现相同接口&#xff0c;但空对象不执行实际逻…...

Redis三剑客解决方案

文章目录 缓存穿透缓存穿透的概念两种解决方案: 缓存雪崩缓存击穿 缓存穿透 缓存穿透的概念 每一次查询的 key 都不在 redis 中&#xff0c;数据库中也没有。 一般都是属于非法的请求&#xff0c;比如 id<0&#xff0c;比如可以在 API 入口做一些参数校验。 大量访问不存…...

大学本科教务系统设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点

以下是大学本科教务系统的设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点: 大学本科教务系统设计方案 一、需求分析 1. 核心用户角色 角色功能需求学生选课/退课、成绩查询、课表查看、学分统计、考试报名、学业预警教师成绩录入、课程大纲上传、教学进度管理、…...

Docker Mysql 数据迁移

查看启动命令目录映射 查看容器名称 docker ps查看容器的启动命令 docker inspect mysql8.0 |grep CreateCommand -A 20如下图所示:我这边是把/var/lib/mysql 目录映射到我宿主机的/mnt/mysql/data目录下,而且我的数量比较大使用方法1的话时间比较久,所以我采用方法2 如果没…...

ubuntu22.04离线安装K8S

1. 准备离线安装包 参考教程离线包准备教程 2. 准备环境 2.1. 准备主机 主机名ip系统k8s-master192.168.38.128ubuntu22.04k8s-node192.168.38.131ubuntu22.04 2.2. 设置host 修改 /etc/hosts 文件&#xff0c;添加master和node节点&#xff0c;需要和主机名保持一致 2…...

微信小程序中将图片截图为正方形(自动居中)

没啥可说的&#xff0c;直接看代码吧&#xff08;邪恶的微信小程序和浏览器的还不一样&#xff09; //将用户图片自动剪切成正方形 const cutImgToSquare (imgPath: string) > {//ts-ignorewx.createSelectorQuery().select(#canvas).fields({ node: true, size: true }).…...

传统的自动化行业的触摸屏和上位机,PLC是否会被取代?

传统的自动化行业的触摸屏和上位机是否会被取代&#xff1f; 在工业自动化领域&#xff0c;触摸屏和上位机长期扮演着核心角色&#xff0c;尤其在污水处理、化工生产等场景中&#xff0c;它们通过实时数据采集、逻辑控制、报警联动等功能&#xff0c;保障了生产设备的稳定运行…...

【论文精读】VLM-AD:通过视觉-语言模型监督实现端到端自动驾驶

论文地址&#xff1a; VLM-AD: End-to-End Autonomous Driving through Vision-Language Model Supervision 摘要 人类驾驶员依赖常识推理来应对复杂多变的真实世界驾驶场景。现有的端到端&#xff08;E2E&#xff09;自动驾驶&#xff08;AD&#xff09;模型通常被优化以模仿…...

2024年数字政府服务能力优秀创新案例汇编(附下载)

12月19日&#xff0c;由中国电子信息产业发展研究院指导、中国软件评测中心主办的“2024数字政府评估大会”在北京召开&#xff0c;大会主题是&#xff1a;为公众带来更好服务体验。 会上&#xff0c;中国软件评测中心副主任吴志刚发布了2024年数字政府服务能力评估结果&#…...

Ollama Docker 镜像部署

文章来源&#xff1a;Docker 部署文档 -- Ollama 中文文档|Ollama官方文档 仅 CPU docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama英伟达 GPU 安装 NVIDIA Container Toolkit。 使用 Apt 安装 配置存储库 curl -fsSL https://nvidia.g…...

[深度学习][python]yolov12+bytetrack+pyqt5实现目标追踪

【算法介绍】 实时目标检测因其低延迟特性而持续受到广泛关注&#xff0c;具有重要的实际应用价值[4, 17, 24, 28]。其中&#xff0c;YOLO系列[3, 24, 28, 29, 32, 45-47, 53, 57, 58]通过有效平衡延迟与精度&#xff0c;在该领域占据主导地位。尽管YOLO的改进多集中在损失函数…...

【深度学习】矩阵的理解与应用

一、矩阵基础知识 1. 什么是矩阵&#xff1f; 矩阵是一个数学概念&#xff0c;通常表示为一个二维数组&#xff0c;它由行和列组成&#xff0c;用于存储数值数据。矩阵是线性代数的基本工具之一&#xff0c;广泛应用于数学、物理学、工程学、计算机科学、机器学习和数据分析等…...

我是如何从 0 到 1 找到 Web3 工作的?

作者&#xff1a;Lotus的人生实验 关于我花了一个月的时间&#xff0c;从 0 到 1 学习 Web3 相关的知识和编程知识。然后找到了一个 Web3 创业公司实习的远程工作。 &#x1f447;&#x1f447;&#x1f447; 我的背景: 计算机科班&#xff0c;学历还可以(大厂门槛水平) 毕业工…...

《Keras 3 :使用 Vision Transformers 进行物体检测》:此文为AI自动翻译

《Keras 3 :使用 Vision Transformers 进行物体检测》 作者:Karan V. Dave 创建日期:2022 年 3 月 27 日最后修改时间:2023 年 11 月 20 日描述:使用 Vision Transformer 进行对象检测的简单 Keras 实现。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 介绍 A…...

java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)

我们再启动应用并获取api密钥后就可以对它发送请求了&#xff0c;但是官方文档对于如何进行多轮对话以及怎么自定义参数并没有说的很清楚&#xff0c;给的模板也没有java的&#xff0c;因此我们需要自己实现。 import org.json.JSONArray; import org.json.JSONObject;import j…...

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 测试&#xff1a; python -c"import cv2"...

将RocketMQ集成到了Spring Boot项目中,实现站内信功能

1. 添加依赖 首先&#xff0c;在pom.xml中添加RocketMQ的依赖&#xff1a; <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifac…...

Deepseek 怼CHATGPT实况

提示词&#xff1a; 用犀利的语言批评ChatGPT 深度思考&#xff08;R1) 嗯&#xff0c;用户让我用犀利的语言批评ChatGPT。首先&#xff0c;我需要理解他们的动机。可能他们遇到了ChatGPT的某些问题&#xff0c;比如回答不准确或者缺乏深度&#xff0c;所以想表达不满。也有…...

基础篇11-图像分割(上)--阈值的方法

图像分割是图像处理的重要内容&#xff0c;是位于底层的图像处理、特征提取与上一层次的图像分析之间的关键步骤。图像分割的相关技术较多&#xff0c;分为三篇介绍。本节是上篇&#xff0c;介绍基于阈值的技术。 1 引言 图像分割是计算机视觉和图像处理中的核心任务之一&…...

[特殊字符] LeetCode 62. 不同路径 | 动态规划+递归优化详解

在解 LeetCode 的过程中&#xff0c;路径计数问题是动态规划中一个经典的例子。今天我来分享一道非常基础但极具代表性的题目——不同路径。不仅适合初学者入门 DP&#xff08;动态规划&#xff09;&#xff0c;还能帮助你打下递归思维的基础。 本文将介绍&#xff1a; &…...

3MF格式转换难题?Blender3mfFormat插件5步解决你的3D打印烦恼

3MF格式转换难题&#xff1f;Blender3mfFormat插件5步解决你的3D打印烦恼 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为Blender与3D打印机之间的格式兼容性头疼吗…...

测试Agent:执行式AI自动化测试

测试Agent&#xff1a;执行式AI自动化测试&#x1f4dd; 本章学习目标&#xff1a;本章展示行业实战案例&#xff0c;帮助读者将理论应用于实践。通过本章学习&#xff0c;你将全面掌握"测试Agent&#xff1a;执行式AI自动化测试"这一核心主题。一、引言&#xff1a;…...

大语言模型自我进化:从依赖人类到自主迭代,未来AI如何实现持续成长?

随着大语言模型&#xff08;LLMs&#xff09;的发展&#xff0c;仅依靠人类监督来提升模型性能的成本高昂且存在局限。本文提出了“自我改进”的概念&#xff0c;即模型自主生成数据、评估输出并迭代优化自身能力。文章从系统级视角提出了一套整合现有技术的统一框架&#xff0…...

基于Falcon-7B构建私人对话机器人的实践指南

1. 从零搭建私人对话机器人的技术解析作为一名长期从事自然语言处理开发的工程师&#xff0c;我经常被问到如何在家用设备上部署类似ChatGPT的对话系统。虽然完整复现ChatGPT需要专业级算力&#xff0c;但通过开源模型和巧妙设计&#xff0c;我们完全可以构建一个功能完备的私人…...

从PyCharm到命令行:YOLOv8目标检测验证的两种姿势(附结果保存路径详解)

从PyCharm到命令行&#xff1a;YOLOv8目标检测验证的两种姿势&#xff08;附结果保存路径详解&#xff09; 在计算机视觉领域&#xff0c;YOLOv8作为当前最先进的目标检测算法之一&#xff0c;以其卓越的速度和精度赢得了开发者的青睐。然而&#xff0c;对于刚接触YOLOv8的开发…...

aardio界面美化进阶:深入解析customPlus的‘六态’机制,让你的列表组件‘活’起来

aardio界面美化进阶&#xff1a;深入解析customPlus的‘六态’机制&#xff0c;让你的列表组件‘活’起来 在桌面应用开发中&#xff0c;列表组件是最常见也最容易被忽视的交互元素。传统的列表往往只提供简单的选中和悬停效果&#xff0c;而aardio的customPlus库通过独创的&q…...

Labwc主题定制终极教程:如何让你的桌面焕然一新

Labwc主题定制终极教程&#xff1a;如何让你的桌面焕然一新 【免费下载链接】labwc A Wayland window-stacking compositor 项目地址: https://gitcode.com/gh_mirrors/la/labwc Labwc作为一款轻量级Wayland窗口堆叠管理器&#xff0c;不仅性能出色&#xff0c;还提供了…...

用LVGL给你的嵌入式设备做个登录界面吧(附完整代码和事件处理逻辑)

从零构建LVGL嵌入式登录界面&#xff1a;实战代码与架构设计 在智能家居面板、工业HMI等嵌入式设备中&#xff0c;用户认证功能几乎是标配需求。本文将手把手教你如何利用LVGL&#xff08;Light and Versatile Graphics Library&#xff09;为嵌入式设备构建一个功能完整的登录…...

一句话出图!生物医学科研绘图天花板

作为常年泡实验室、写论文申基金的科研狗&#xff0c;谁没为了一张图掉过头发&#xff1f;做实验结果图要调格式&#xff0c;画机制图找不对素材&#xff0c;做组会PPT要改海报&#xff0c;找外包画图不仅贵还要等一周&#xff0c;自己用PS又半天摸不着门道。相信我&#xff0c…...

硬件安全模糊测试与泄漏合约的创新融合

1. 硬件安全模糊测试与泄漏合约的融合创新在处理器安全研究领域&#xff0c;一个长期存在的矛盾是&#xff1a;现代高性能处理器通过复杂的微架构优化&#xff08;如乱序执行、推测执行&#xff09;来提升性能&#xff0c;但这些优化往往成为信息泄漏的源头。2018年曝光的Spect…...