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…

python 进阶教程--PIL图像处理

PIL图像处理 1. Pillow库简介2. 图像处理基础3. 图像操作4. 图像增强5. 图像处理进阶6. 图像绘制7. 图像序列和动画8. 图像识别和特征提取9. 实战项目10. 常见问题解答 1. Pillow库简介 PIL与Pillow的关系 PIL(Python Imaging Library)是一个提供图像处…

【云原生之kubernetes实战】在k8s环境下部署OrangeHRM人力资源管理系统

【云原生之kubernetes实战】在k8s环境下部署OrangeHRM人力资源管理系统 一、OrangeHRM介绍1.1 OrangeHRM 简介1.2 OrangeHRM特点1.3 OrangeHRM使用场景二、相关知识介绍2.1 本次实践存储介绍2.2 k8s存储介绍三、本次实践介绍3.1 本次实践简介3.2 本次环境规划3.3 部署前需准备工…

bash终端快捷键

快捷键作用ShiftCtrlC复制ShiftCtrlV粘贴CtrlAltT新建终端ShiftPgUp/PgDn终端上下翻页滚动CtrlC终止命令CtrlD关闭终端CtrlA光标移动到最开始为止CtrlE光标移动到最末尾CtrlK删除此处到末尾的所有内容CtrlU删除此处至开始的所有内容CtrlD删除当前字符CtrlH删除当前字符的前一个…

Perl 语言开发(十):正则表达式,掌握强大文本处理的利器

目录 1. 正则表达式概述 2. 基础正则表达式语法 2.1 字符和字符类 2.2 预定义字符类 2.3 量词 2.4 分组和捕获 2.5 反向引用 3. Perl 中的正则表达式操作 3.1 匹配操作 3.2 替换操作 3.3 分割操作 4. 正则表达式的高级特性 4.1 非捕获分组 4.2 前瞻和后顾 4.3 负…

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/…

linux 代理export

export http_proxyhttp://10.67.11.138:7890 export https_proxyhttp://10.67.11.138:7890

大/小端模式与位操作

文章目录 1. 大小端模式 2. 大端模式(Big-endian) 3. 小端模式(Little Endian) 4. 判断和转换大小端模式 5. 位操作 5.1 移位操作 5.2 取反操作 5.3 位与操作 5.4 位或操作 5.5 置位操作 5.6 清位操作 1. 大小端模式 …

大数据学习之 scala基础(补充)

scala基础: hello world: 写scala可运行文件的注意事项1、如果一个scala文件要运行,class要改成object2、如果是class,就仅单纯代表一个类,如果是object代表的是单例对象3、scala语法中,一句话结束不需要加分号4、sca…

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:…

vue2封装向上滚动组件

目录 1.代码2.使用 1.代码 <template><div class"marquee-wrap" :style"{height: height px}"><ul class"marquee-list":style"animateUpStyle"v-on:mouseover"myMouseover"v-on:mouseout"myMouseout…

工厂方法模式在金融业务中的应用及其框架实现

引言 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;它定义了一个创建对象的接口&#xff0c;但由子类决定实例化哪一个类。工厂方法模式使得类的实例化延迟到子类。在金融业务中&#xff0c;工厂方法模式可以用于创建不同类型…

惠普Z系列AI台式工作站家族

聚焦智能制造、数据科学及人工智能、3D图形图像等高精尖领域&#xff0c;为客户提供高性能、强稳定、强拓展的台式工作站产品及解决方案。 HP Z1 Tower G9 VR创作 / 设计建模 适用于VR内容创作及设计建模等工作可支持128G DDR5内存&#xff0c;第十四代Intel Core™ vPro™ CPU…

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

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

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

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

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

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