设计模式-空对象模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 空对象模式和单例模式的区别
    • 代码示例
      • Java实现空对象模式
      • Python实现空对象模式
    • 空对象模式在spring中的应用


模式介绍

空对象模式是一种设计模式,用于处理对象不存在的情况。它通过返回一个空对象来代替 null 值,从而避免了空指针异常。空对象通常具有与正常对象相同的接口,但其方法体为空或返回默认值。

在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。

空对象模式的优点包括:

  1. 加强系统的稳固性,有效地防止空指针报错对整个系统的影响,使系统更加稳定。
  2. 实现对空对象情况的定制化的控制,掌握处理空对象的主动权。
  3. 不依靠Client来保证整个系统的稳定运行。
  4. 通过isNull对==null的替换,显得更加优雅,更加易懂。

此外,空对象模式还可以提高代码复用性,减少代码重复,提高程序的可读性。

在这里插入图片描述

模式特点

  • 空对象模式的优点主要包括:
  1. 减少了对null的检查,有效地避免了NullPointerException异常。
  2. 减少了代码量,使代码变得更加简洁。
  3. 更容易理解和测试,因为不需要考虑null值的情况。
  4. 使系统更加稳定,避免程序抛出NullPointerException异常。
  5. 提高代码复用性,减少代码重复,提高程序的可读性。
  • 空对象模式也存在一些缺点:
  1. 如果使用不当,可能会降低性能。
  2. 如果使用不当,可能会对代码逻辑造成影响。
  3. 如果使用不当,可能会对应用的扩展性造成影响。
  4. 空对象本身也是一个对象,如果创建太多的话也会降低性能。
  5. 空对象本身也是一个对象,如果创建太多的话也会降低内存占用量。

在使用空对象模式时需要谨慎考虑其优缺点,并正确地使用该模式。

在这里插入图片描述

应用场景

空对象模式的应用场景包括但不限于:

  1. 当对象实例需要一个协作实例,但不需要引入新的协作实例时,可以使用空对象模式。
  2. 当部分协作实例不需要做任何处理时,可以使用空对象模式。
  3. 当需要从客户端中抽象出不存在对象实例的代码逻辑时,可以使用空对象模式。
  4. 在场景中,不想让面板直接漂浮在对象模型上,可以利用空对象,挂载面板,并放置目标的位置上。
  5. 当需要根据不同的判定结构展示多卡片时,可以利用空对象模式。
  6. 在需要将同类设备进行统一编组,例如对辊床进行编组管理时,可以使用空对象模式。
  7. 在目标对象需要在非实体模型上生成或发生碰撞时,可以利用空对象模式。
  8. 在需要将模型纳内分组,按照所需要的比例调整空对象的缩放比例时,可以利用空对象模式实现比例尺的功能。
  9. 当需要将模型作为全局视效或驱动脚本的挂载载体时,可以利用空对象模式。

请注意,这只是一些应用场景示例,并非空对象模式的全部应用场景。具体使用需要根据实际需求来判断是否适用。

在这里插入图片描述

空对象模式和单例模式的区别

空对象模式和单例模式是两种不同的软件设计模式,它们的目标和应用场景也不同。

空对象模式是一种处理对象不存在的模式,通过返回一个空对象来代替 null 值,从而避免了空指针异常。它的主要优点包括减少对 null 的检查,简化代码,提高代码复用性和可读性等。

单例模式则是一种创建类型的模式,其目标是在整个应用程序中只创建一个对象实例。它的优点包括节省内存资源,保证数据内容的一致性,避免对资源的多重占用等。

空对象模式关注的是如何处理不存在的对象,而单例模式关注的是如何确保某个类只有一个实例。

在这里插入图片描述

代码示例

Java实现空对象模式

在Java中实现空对象模式,可以通过创建一个空对象类来实现。这个空对象类通常继承自需要使用空对象模式的类,并实现所有方法,但方法体为空或返回默认值。

以下是一个示例代码,演示如何实现空对象模式:

public class EmptyObject {private static EmptyObject instance = new EmptyObject();private EmptyObject() {}public static EmptyObject getInstance() {return instance;}// 空对象的所有方法都是空的或者返回默认值public void doSomething() {}public String getName() {return "Empty Object";}
}

在上面的示例中,EmptyObject类继承自需要使用空对象模式的类(例如某个具体的业务类),并实现了所有方法。这些方法的实现都是空的或者返回默认值。getInstance()方法用于获取空对象的实例。

使用空对象模式时,可以像使用普通对象一样使用空对象。例如:

public class Main {public static void main(String[] args) {// 使用空对象EmptyObject emptyObject = EmptyObject.getInstance();emptyObject.doSomething(); // 调用空对象的方法,不会抛出异常System.out.println(emptyObject.getName()); // 输出 "Empty Object"}
}

在上面的示例中,我们通过EmptyObject.getInstance()方法获取了一个空对象的实例,并像使用普通对象一样调用了它的方法。由于这些方法都是空的或者返回默认值,因此不会抛出异常。

Python实现空对象模式

在Python中,实现空对象模式可以通过定义一个空类或者使用None对象来实现。

以下是使用空类实现空对象模式的示例代码:

class EmptyObject:pass# 使用空对象
empty_obj = EmptyObject()
empty_obj.do_something()  # 不会抛出异常

在上面的示例中,我们定义了一个名为EmptyObject的空类,它没有任何方法和属性。通过实例化这个空类,我们可以得到一个空对象。调用空对象的方法时,不会抛出异常,因为这些方法都没有被实现。

另外,Python内置的None对象也可以作为空对象的替代品。使用None对象可以更加简洁地表示空对象的概念。以下是使用None对象实现空对象模式的示例代码:

# 使用None作为空对象
empty_obj = None
empty_obj.do_something()  # 不会抛出异常

在上面的示例中,我们使用None对象来表示空对象。调用None对象的方法时,同样不会抛出异常,因为None对象没有任何方法。

无论使用哪种方式实现空对象模式,关键在于确保空对象的所有方法都没有被实现或者返回默认值,以避免出现异常。

在这里插入图片描述

空对象模式在spring中的应用

空对象模式在Spring框架中有一定的应用,主要涉及处理null值的场景。Spring框架提供了Null对象设计模式,用于处理对象为空的情况,避免NullPointerException异常。

在Spring中,可以使用@Nullable注解来标记一个方法或参数可以为空。当调用该方法或传递该参数时,如果值为null,Spring会抛出一个异常。

另外,Spring还提供了@NonNull注解来标记一个方法或参数不能为空。如果调用该方法或传递该参数时值为null,Spring会抛出一个异常。

通过使用@Nullable和@NonNull注解,可以在Spring中有效地处理null值,避免出现NullPointerException异常。

需要注意的是,空对象模式和Null对象设计模式是两个不同的概念。空对象模式关注的是如何处理不存在的对象,而Null对象设计模式关注的是如何处理null值。在Spring中,主要应用的是Null对象设计模式来处理null值的情况。

在这里插入图片描述

设计模式-单例模式

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

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

相关文章

flutter 配置安卓的签名

背景 最近遇到一个需求&#xff0c;需要实现app的热更新,了解了一下热更新方案时间的时间有点久&#xff0c;就做了个app升级的过渡版本&#xff0c;然后遇到问题 真机安装遇到签名不一致的问题 如下 安装过程 版本升级的代码如下 ///版本更新检查static Future<VersionEnti…

冲刺2024年AMC8竞赛:往年真题练一练和答案详解(3)

今天我们继续来做一做往年的AMC8真题&#xff0c;通过高质量的真题来体会我们所学的知识如何解题&#xff0c;建立快速思考、做对题目的策略。 今天分享的五道题目仍然是随机从六分成长独家制作的575道在线题库&#xff08;来自于往年真题&#xff09;中抽取5道题来做一下&…

Parallel patterns: convolution —— An introduction to stencil computation

在接下来的几章中&#xff0c;我们将讨论一组重要的并行计算模式。这些模式是许多并行应用中出现的广泛并行算法的基础。我们将从卷积开始&#xff0c;这是一种流行的阵列操作&#xff0c;以各种形式用于信号处理、数字记录、图像处理、视频处理和计算机视觉。在这些应用领域&a…

Linux环境变量LD_LIBRARY_PATH配置

解决snmpwalk报错 报错提示&#xff1a;./bin/snmpwalk:error while loading shared libraries:libnetsnmp.so.40:cannot open shared object file: No such file or directory. 环境变量LD_LIBRARY_PATH LD_LIBRARY_PATH是Linux环境变量名&#xff0c;该环境变量主要用于指…

基于ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

Java泛型:灵活多变的类型参数化工具

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、泛型1、什么是泛型2、泛型的语法 二、泛型类的使用1、泛型类的语法2、泛型如何编译的2.1、擦除机制2.2、为什么不能实例化泛…

控制el-table的列显示隐藏

控制el-table的列显示隐藏&#xff0c;一般的话可以通过循环来实现&#xff0c;但是假如业务及页面比较复杂的话&#xff0c;list数组循环并不好用。 在我们的页面中el-table-column是固定的&#xff0c;因为现在是对现有的进行维护和迭代更新。 对需要控制列显示隐藏的页面进…

Queue接口分析

一、Queue是什么 该接口是Java集合框架成员 Queue&#xff1a; 通常&#xff08;但不一定&#xff09;队列就是一个先入先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;和堆一样&#xff08;但可以进行转换&#xff0c;比如优先级列队排序&#xff0c;又或者改为栈形…

私域爆款活动实操指南,让你轻松成为营销高手!

私域运营活动是公司运营中非常重要的一环&#xff0c;它能够提高用户参与度、增加用户忠诚度&#xff0c;并为公司带来更多的商业机会。然而&#xff0c;策划和执行一场成功的私域运营活动并不容易&#xff0c;需要思维缜密、部门合作以及落地能力等方面的综合素养。今天来跟大…

centos下升级git版本

1 问题描述 centos7系统默认的git安装版本是1.8&#xff0c;但是在项目构建中发现git版本过低&#xff0c;导致构建AI模型环境时出现各种错误&#xff0c;于是用源码编译的方式进行升级&#xff0c;同时该文章也适用于安装新的git。 2. 升级安装 2.1 第一步卸载原有的git r…

怎么把视频设置为电脑桌面

1、打开腾讯软件中心&#xff0c;搜索并下载【火萤视频桌面】&#xff0c;不要安装&#xff08;因为卸载会出错&#xff09;。 2、找到下载的火萤视频桌面exe程序&#xff0c;以【打开压缩包】的方式打开&#xff0c;把其中的WPengine文件夹解压到桌面。 3、双击打开WPengine…

亚信安全深度解读2023年中国网络安全重要政策法规

亚信安全在对2023年国内网络安全政策的持续跟踪和研究基础上进行了详细分析。观察整体态势&#xff0c;本年度网络安全政策的发布呈现出高密度特征&#xff0c;共计引起行业高度关注的政策达50余项。数据安全领域、个人信息保护和数据跨境安全成为关注的热点&#xff0c;分别有…

Java面试之并发篇(一)

1、前言 本篇主要总结JAVA面试中关于并发相关的高频面试题。本篇的面试题基于网络整理&#xff0c;和自己编辑。在不断的完善补充哦。 2、简述程序、进程、线程、的基本概念&#xff1f; 2.1、程序 程序&#xff0c;是含有指令和数据的文件&#xff0c;被存储在磁盘或其他的…

大数据开发个人简历范本(2024最新版-附模板)

大数据开发工程师个人简历范本> 男 22 本科 张三 计算机科学与技术 1234567890 个人概述 具备深入的Hadoop大数据运维工程师背景&#xff0c;熟悉相关技术和工具 具备良好的团队合作能力&#xff0c;善于沟通和协作 具有快速学习新知识和解决问题的能力 对于数据科学…

Java中的集合框架

概念与作用 集合概念 现实生活中&#xff1a;很多事物凑在一起 数学中的集合&#xff1a;具有共同属性的事物的总体 java中的集合类&#xff1a;是一种工具类&#xff0c;就像是容器&#xff0c;储存任意数量的具有共同属性的对象 在编程时&#xff0c;常常需要集中存放多个…

GEE计算Landsat8的NDVI

目录 前言源代码结果 前言 NDVI&#xff08;近红-红&#xff09;/&#xff08;近红红&#xff09; normalizedDifference方法是&#xff08;A-B&#xff09;/&#xff08;AB&#xff09;的计算方法 计算NDVI一般用来配合其他反演参数&#xff0c;构造指数或者数据升降尺度。 …

Java IO学习和总结(超详细)

一、理解 I/O 是输入和输出的简写&#xff0c;指的是数据在计算机内部和外部设备之间的流动。简单来说&#xff0c;当你从键盘输入数据、从鼠标选择操作&#xff0c;或者在屏幕上看到图像&#xff0c;这些都是 I/O 操作。它就像是计算机与外部世界沟通的桥梁&#xff0c;没有 I…

linux项目部署(jdk,tomcat,mysql,nginx,redis)

打开虚拟机&#xff0c;与连接工具连接好&#xff0c;创建一个文件夹 cd /tools 把jdk,tomcat安装包放入这个文件夹里面 jdk安装 #解压 tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 编辑jdk文件以及测试jdk安装 第一行代码路径…

Poi实现根据word模板导出-图表篇

往期系列传送门&#xff1a; Poi实现根据word模板导出-文本段落篇 &#xff08;需要完整代码的直接看最后位置&#xff01;&#xff01;&#xff01;&#xff09; 前言&#xff1a; 补充Word中图表的知识&#xff1a; 每个图表在word中都有一个内置的Excel&#xff0c;用于…

以unity技术开发视角对android权限的讲解

目录 前言 Android权限分类 普通权限 普通权限定义 普通权限有哪些 危险权限 危险权限的定义 危险权限有哪些 动态申请权限实例 申请单个权限实例 第一步&#xff1a;在清单文件中声明权限 第二步&#xff1a;在代码中进行动态申请权限 申请多个权限实例 第一步&am…