NET Core 中的空对象设计模式

介绍

一种称为“空对象模式”的行为设计模式提供了一个对象来表示接口缺少的对象。在空对象会导致空引用异常的情况下,这是一种提供替代行为的方法。在本文中,我们将深入探讨 C# 空对象模式,并逐步解决更复杂的情况。

空对象设计模式它是什么?

一种设计方法是使用 Null 对象模式,它使使用可能未定义的依赖项变得更容易。这不是使用空引用,而是通过使用实现可识别接口的具体类的实例来实现。创建一个概括要执行的不同操作的抽象类,以及扩展它的具体类和一个空对象类,该类提供该类的无操作版本,可用于我们需要检查空值的任何地方。

空对象设计模式的组件

客户

依赖于扩展抽象 DependencyBase 类或实现 Dependency 接口的对象的代码称为客户端。客户端使用此对象执行任务。客户端应该能够以相同的方式处理真实对象和空对象,而无需知道它正在处理哪种对象。

DependencyBase 或抽象依赖

名为 DependencyBase 的抽象类或接口指定了所有具体依赖项(包括空对象)必须实现的方法。此类定义了所有依赖项必须遵守的契约。

依赖还是真实依赖

客户端可以将此类用作功能依赖项。客户端无需知道依赖项对象是实际的还是空的,即可与它们进行交互。

NullObject 或 Null Dependency

这是客户端可用作依赖项的空对象类。虽然它实现了 DependencyBase 抽象类指定的每个成员,但它缺乏功能。系统中为空或不存在的依赖项由 NullObject 表示。客户端可以安全地调用 NullObject 上的方法,而不会导致错误或需要进行空检查。

举例来说

抽象依赖

这是ICar.cs文件的代码。

public interface ICar
{void Drive();void Stop();
}

真实依赖

这是 SedanCar.cs 文件的代码。

public class SedanCar : ICar
{public void Drive(){Console.WriteLine("Drive the sedan car.");}public void Stop(){Console.WriteLine("Stop the sedan car.");}
}

空对象依赖

这是 NullCar.cs 文件的代码。

public class NullCar : ICar
{public void Drive(){}public void Stop(){}
}

客户

这是 CarService.cs 文件的代码。

public class CarService(ICar car)
{private readonly ICar _car = car;public void Run(){Console.WriteLine($"Start run method. {nameof(ICar)}: {_car}");_car.Drive();_car.Stop();Console.WriteLine($"Complete run method. {nameof(ICar)}: {_car}");Console.WriteLine();}
}

程序

这是 Program.cs 文件的代码。

var sedanCar = new SedanCar();
var carService = new CarService(sedanCar);carService.Run();var nullCar = new NullCar();
carService = new CarService(nullCar);carService.Run();

输出

何时应用空对象设计模式?

当您想要提供对象功能的默认或无操作实现以避免空检查并妥善处理空引用时,可以使用空对象设计模式。以下情况需要应用空对象设计模式。

  • 默认行为:当对象的实际实现不可用或不合适时,您想要赋予该对象的行为。
  • 避免空检查:当您想要提供一个可以安全地代替空引用使用的空对象实现时,您可以避免在代码中执行显式空检查。
  • 一致的界面:当您需要让客户访问一个界面时,无论他们使用的是真实对象还是空对象,该界面都保持不变。
  • 简化客户端代码:当您希望让客户端代码以与实际对象相同的方式处理空对象,从而使客户端代码免于处理空引用。

何时不应使用空对象设计模式?

在下列情况下,空对象设计模式可能不合适。

  • 复杂行为:空对象设计模式旨在提供简单的默认行为;因此,当空对象需要实现复杂的行为或存储状态时,它可能是不可接受的。
  • 性能考虑:如果生成和使用空对象会显著增加系统的开销或复杂性,那么最好直接在代码中处理空引用。
  • 与真实对象的混淆:如果系统中存在空对象和真实对象可能混淆的可能性,则可能需要进行显式空检查,以提高代码的可读性和清晰度。

概括

空对象模式(一种设计模式)提供了一种可靠的方法来处理对象缺失问题。它通过提供默认行为并消除空值检查的必要性,降低了运行时出错的可能性并简化了客户端代码。为了提高稳定性和可维护性,空对象模式在构建新系统或重组旧系统时可能是一个有用的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/43372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s离线部署芋道源码前端

目录 概述 编译Dockerfile 构建Dockerfilenginx.conf构建 k8s部署前端镜像部署ingress 概述 本篇将对 k8s离线部署芋道源码前端 进行详细的说明,对如何构建 Dockerfile,如何整合 Nginx,如何整合 ingress 进行实践。 相关文章:naco…

Hugging face Transformers(4)—— Model

Hugging Face 是一家在 NLP 和 AI 领域具有重要影响力的科技公司,他们的开源工具和社区建设为NLP研究和开发提供了强大的支持。它们拥有当前最活跃、最受关注、影响力最大的 NLP 社区,最新最强的 NLP 模型大多在这里发布和开源。该社区也提供了丰富的教程…

【Bug优化】支付宝支付中“交易订单处理失败,请稍后再试”问题

引言 近期,一位友友问:他在集成支付宝支付功能时遇到了一个棘手的问题,当用户在支付过程中选择放弃支付,尝试重新支付同一订单时,前端会显示“交易订单处理失败,请稍后再试”。 这个问题的核心在于支…

文章SameStr(一):图1代码

“Publication Figure 1” 百度云盘链接: https://pan.baidu.com/s/15g7caZp354zIWktpnWzWhQ 提取码: 4sh7 Libraries Standard Import library(tidyverse) library(cowplot) library(scales) library(ggpubr)Special # devtools::install_github("pmartinezarbizu/…

Spring的AOP基础以及AOP的核心概念

2. AOP基础 学习完spring的事务管理之后,接下来我们进入到AOP的学习。 AOP也是spring框架的第二大核心,我们先来学习AOP的基础。 在AOP基础这个阶段,我们首先介绍一下什么是AOP,再通过一个快速入门程序,让大家快速体…

Ubuntu配置GitHub(第一次clone/push)

文章目录 1. 安装Git&检查连接2. 注册GitHub3. 生成&GitHub添加SSH3.1. 检查&删除已有id_rsa3.2. 生成SSH3.3. GitHub添加id_rsa.pub SSH3.4. 检查SSH 4. 继续开发可以参考参考 1. 安装Git&检查连接 安装 sudo apt-get install git检查SSH连接 ssh -T gitgi…

【工具分享】零零信安攻击面管理平台

文章目录 00SEC-ASM™功能介绍功能演示 最近闲来无事,到处网上冲浪,无意间发现了长亭云图攻击面管理平台,无奈需要授权才能使用,于是就找到了平替:零零信安攻击面管理平台。 长亭云图攻击面管理平台:https:…

Windows下cmd快速到达指定文件位置(三种方法)

一、图形界面 第一步: 点击此图标 在搜索框输入“cmd”,打开命令提示符 或者: 快捷键windowR,点击“确定” 第二步: 先进盘 比如d盘,输入 d: (注意英文输入法),再进文件…

前沿重器[53] | 聊聊搜索系统6:精排

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经…

充分利用视觉信息多问多答合成数据,提升多模态大模型数学推理能力

©PaperWeekly 原创 作者 | 史文浩 单位 | 电子科技大学 论文题目: Math-LLaVA: Bootstrapping Mathematical Reasoning for Multimodal Large Language Models 论文链接: https://arxiv.org/abs/2406.17294 开源链接: https://github.c…

最新国内免费使用GPT4o、4.0、3.5 的方法

为了方便大家对GPT有更好的了解,这里特地整理了一个表格做对比 这些模型展示了OpenAI在自然语言处理领域的持续进步,每一代模型都在理解和生成能力、效率和适用性方面进行了显著提升。 网站汇总 这里顺便给大家汇总一下国内同类型的网站,有…

每日一练全新考试模式解锁|考试升级

🙋频繁有小伙伴咨询:我想举办一场历时一个月的答题活动,学生可以每天打开答题,活动完结后可以导出每天的答题成绩 此前我们都会让小伙伴创建30场考试,然后使用批量分享功能组合起来,对外分享一个链接就可以…

【chatgpt消费者偏好】是什么驱动了游客持续旅游意愿?推文分享—2024-07-08

今天推文的主题是【chatgpt&消费者意愿】 第一篇:文章主要研究了什么因素驱动旅游者继续使用ChatGPT进行旅行服务,并从人类拟态的角度探讨了旅游者对ChatGPT的感知和使用意图。第二篇:本文探讨了ChatGPT-4在生成针对TripAdvisor上发布的…

基于门控循环单元 GRU 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

# 昇思25天学习打卡营第10天 | 使用静态图加速

昇思25天学习打卡营第10天 | 使用静态图加速 文章目录 昇思25天学习打卡营第10天 | 使用静态图加速动态图的开启方式静态图的开启方式基于全局context的开启方式基于修饰器的开启方式 总结打卡 AI编译框架分为两种运行模式: 动态图模式: 计算图的构建和计…

读人工智能全传07智能体

1. 布鲁克斯革命 1.1. 随着科学认知的发展,有时候旧有科学体系会面临全盘崩溃的危机,新的科学体系诞生,取代传统的、既定的科学体系,这就意味着科学的范式将发生变化 1.2. 澳大利亚机器人学家罗德尼布鲁克斯(Rodney Brooks)&…

DS1302实时时钟芯片_读写时间实现电子钟功能

一、前言 1.1 功能说明 本项目以STC90C51单片机为核心,结合DS1302实时时钟芯片和IIC协议的OLED显示屏,设计了一款功能丰富、操作简便的电子时钟。 【1】项目目标 实现高精度的时间显示,包括时、分、秒。提供按键调整时间的功能&#xff0…

[Java]Swing版坦克大战小游戏项目开发(1)——new出一个窗口

highlight: xcode theme: vuepress 前言 本系列文章带领 Java 初学者学习使用 Java 语言结合 Swing 技术以及设计模式开发一款经典小游戏——坦克大战。通过这个小游戏,你可以学会很多实用的设计模式思想,并且提高你的编码水平。 熟悉Frame Frame 类是 J…

【java计算机毕设】基于java的奶茶店管理系统的设计与实现MySQL ssm JSP maven项目代码源码+文档

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】奶茶店管理系统java MySQL ssm JSP maven项目源码代码万字文档 小组设计 2项目介绍 系统功能: 奶茶店管理系统包括管理员、用户俩种角色。 管理员功能包括个人中心模块用于修改个人信息和密码、…

UDP通讯实现

服务器端&#xff1a; 1.获取套接字 int fd;fdsocket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);} #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain: 指定通信域&…