设计模式-空对象模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 空对象模式和单例模式的区别
    • 代码示例
      • 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值的情况。

在这里插入图片描述

设计模式-单例模式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频号小店发展趋势如何?适合新手吗?

我是电商珠珠 视频号团队在22年7月发展了自己的电商平台-视频号小店。截止到目前为止,也发展了不过一年的时间,所以各项平台政策还不太严谨。 一个新兴平台所做的第一步就是招揽更多的商家来入驻,就会将红利全部倾向商家,而在今…

6.1.2捕捉图像(3)

6.文字捕捉 除了可以捕捉图像外,HyperSnap6还有一个非常神奇、非常实用的功能——文字捕捉。利用文字捕捉,可以把一段不可复制的文字捕捉下来,以便于重新编辑。 (1)右单击桌面上的“我的电脑”,在弹出的快捷菜单中选…

Kubernetes(K8S)云服务器实操TKE

一、 Kubernetes(K8S)简介 Kubernetes源于希腊语,意为舵手,因为首尾字母中间正好有8个字母,简称为K8S。Kubernetes是当今最流行的开源容器管理平台,是 Google 发起并维护的基于 Docker 的开源容器集群管理系统。它是大名鼎鼎的Google Borg的开源版本。 K8s构建在 Docker …

世微 AP6608 DC-DC转换器 1.2MHz 2-24V 2A升压转换IC

FEATURES? Integrated 80mΩ Power MOSFET ? 2V to 24V Input Voltage ? 1.2MHz Fixed Switching Frequency ? Internal 4A Switch Current Limit ? Adjustable Output Voltage ? Internal Compensation ? Up to 28V Output Voltage ? Automatic Pulse Frequency Modul…

聚道云软件连接器助力某电商企业实现电商业务与财务系统的数据互通

客户介绍: 某电商企业是一家集电商平台、仓储物流、售后服务等业务于一体的综合性电商企业。公司业务遍布全国多个城市,拥有庞大的客户群和销售额。 添加图片注释,不超过 140 字(可选) 客户痛点: 有赞商…

高通ais over hab高概率导致安卓系统起不来原因分析及解决方案

一)ais概述 高通8155的摄像头驱动在hostOS qnx上,guestOS 安卓要使用摄像头,就需要就需要通过hab机制与qnx通信。 Ais框架如下 二)ais的控制通道与数据通道 a)控制通道即,front end需要将start/stop摄像头的控制命令发…

arm64虚拟化技术与kvm实现原理分享

文章目录 1 简介2 arm64 虚拟化相关硬件支持2.1 arm64 cpu 虚拟化基本原理及硬件支持2.2 系统寄存器捕获和虚拟寄存器支持2.3 VHE 特性支持2.4 内存虚拟化支持2.5 IO 虚拟化支持2.6 DMA 虚拟化支持2.7 中断虚拟化支持2.8 定时器虚拟化支持 3 arm64 kvm 初始化流程3.1 初始化总体…

烟火检测/区域人流统计/AI智能分析网关V4如何配置通道?

TSINGSEE青犀智能分析网关(V4版)是一款高性能、低功耗的软硬一体AI边缘计算硬件设备,硬件内部署了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,并上报识别结果,并能进行语音…

vue cli脚手架

1. vue cli 脚手架安装 参考官网:https://cli.vuejs.org/zh/guide/installation.html 步骤如下: 全局安装 npm install -g vue/cli # OR yarn global add vue/cli查看版本 vue --version # OR vue -V升级Vue cli (需要升级的时候&#x…

nginx(1.13.7)首次安装出现:【make: *** 没有规则可以创建“default”需要的目标“build” 问题】解决措施

目录 前言: 一.龙蜥(Anolis)操作系统上安装GCC 1.安装gcc 2.检验安装 二.安装出现 make: *** 没有规则可以创建“default”需要的目标“build” 问题 1.解压安装nginx 2.安装出现问题展示 3.解决措施 4.重新编译进行安装 5…

2024年能报考的人工智能行业有哪些证书呢?

近期工信部颁发的两个证书现在正在报考中,大家可以参考下: 《计算机视觉处理设计开发工程师》中级 2024年1月24日至28日-北京 《自然语言与语音处理设计开发工程师》中级 2024年2月29日-3月4日-上海 证书益处: 1.含金量高:…

JPEG格式详解Baseline、Progressive的区别

文章目录 JPEG的简介压缩质量/压缩比率色彩空间基线和渐进子采样存储选项 基线和渐进基线格式渐进格式: 子采样4:4:4(无损)4:2:24:2:0 JPEG的简介 JPEG(Joint Photographic Experts Group)是一种常见的图像压缩格式&a…

逐步分解,一文教会你如何用 jenkins+docker 实现主从模式

jenkins 主从模式想必大家都不陌生,大家在学习过程中为了学习方便都在自己本地搭建了 jenkins 环境,然后通过 javaweb 方式实现,对于 docker 下实现主从模式大家好像兴趣挺大。 今天就通过这篇文章给大家讲讲怎么玩,希望对大家有帮…

共享wifi项目如何加盟?

共享wifi贴项目如何加盟呢?具体的途径在哪里,费用是多少呢?今天小编就来一次性同你讲清楚。 我们先来讲一下共享wifi贴的加盟方法。 首先,找到共享wifi的官方渠道在点击右上角,根据页面上的信息填写资料。 然后&…

Python学习之路-Hello Python

Python学习之路-Hello Python Python解释器 简介 前面说到Python是解释型语言,Python解释器的作用就是用于"翻译"Python程序。Python规定了一个Python语法规则,根据该规则可编写Python解释器。 常见的Python解释器 CPython:官方…

如何在linux下制作静态库和动态库

目录 静态库(.a)制作静态库如何使用静态库 动态库(.so)制作动态库如何使用动态库(.so) 静态库(.a) 静态库顾名思义是静态的,即程序编译链接时,会把静态库的代码链接到可执行文件中。运行时不需要静态库(将静态库删了也能运行)。相…

日志级别(因设置错误级别日志导致宕机)

日志等级 All:最低等级的,用于打开所有日志记录. Trace:是追踪,就是程序推进一下. Debug:用于调试或者开发阶段 Info:消息在粗粒度级别上突出强调应用程序的运行过程. Warn:输出警告及warn以下级别的日志. Error:输出错误信息日志. Fatal:输出每个…

【EI会议征稿通知】第五届计算机信息和大数据应用国际学术会议(CIBDA 2024)

第五届计算机信息和大数据应用国际学术会议(CIBDA 2024) 2024 5th International Conference on Computer Information and Big Data Applications 第五届计算机信息和大数据应用国际学术会议(CIBDA 2024)将于2024年4月26-28日在…

Spring MVC全局异常处理器

如果不加以异常处理,错误信息肯定会抛在浏览器页面上,这样很不友好,所以必须进行异常处理。 1.异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异…

Spring MVC中JSON数据处理方式!!!

添加json依赖 <!--spring-json依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency> 注解 RequestBody&#xff1a;作…