二十六、空对象模式 ( Null Object Pattern )

news/2023/5/28 9:02:58

在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查

Null 对象不是检查空值,而是反应一个不做任何动作的关系,这样的 Null 对象也可以在数据不可用的时候提供默认的行为。

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

实现

我们将创建一个定义操作(在这里,是客户的名称)的 AbstractCustomer 抽象类,和扩展了 AbstractCustomer 类的实体类

工厂类 CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象

NullPatternDemo ,我们的演示类使用 CustomerFactory 来演示空对象模式的用法

范例

1. 创建一个抽象类 AbstractCustomer

// author: 搜云库技术团队(tech.souyunku.com)
// Copyright © 2015-2065 tech.souyunku.com. All rights reserved.package com.souyunku.tech.gof;public abstract class AbstractCustomer
{protected String name;public abstract boolean isNil();public abstract String getName();
}

2. 创建扩展了上述类的实体类

RealCustomer

// author: 搜云库技术团队(tech.souyunku.com)
// Copyright © 2015-2065 tech.souyunku.com. All rights reserved.package com.souyunku.tech.gof;class RealCustomer extends AbstractCustomer
{public RealCustomer(String name) {this.name = name;     }@Overridepublic String getName() {return name;}@Overridepublic boolean isNil() {return false;}
}

NullCustomer

// author: 搜云库技术团队(tech.souyunku.com)
// Copyright © 2015-2065 tech.souyunku.com. All rights reserved.package com.souyunku.tech.gof;public class NullCustomer extends AbstractCustomer {@Overridepublic String getName() {return "Not Available in Customer Database";}@Overridepublic boolean isNil() {return true;}
}

3. 创建 CustomerFactory 类

// author: 搜云库技术团队(tech.souyunku.com)
// Copyright © 2015-2065 tech.souyunku.com. All rights reserved.package com.souyunku.tech.gof;public class CustomerFactory {public static final String[] names = {"Rob", "Joe", "Julie"};public static AbstractCustomer getCustomer(String name){for (int i = 0; i < names.length; i++) {if (names[i].equalsIgnoreCase(name)){return new RealCustomer(name);}}return new NullCustomer();}
}

4. 使用 CustomerFactory ,基于客户传递的名字,来获取 RealCustomer 或 NullCustomer 对象

// author: 搜云库技术团队(tech.souyunku.com)
// Copyright © 2015-2065 tech.souyunku.com. All rights reserved.package com.souyunku.tech.gof;public class NullPatternDemo {public static void main(String[] args) {AbstractCustomer customer1 = CustomerFactory.getCustomer("Rob");AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob");AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie");AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura");System.out.println("Customers");System.out.println(customer1.getName());System.out.println(customer2.getName());System.out.println(customer3.getName());System.out.println(customer4.getName());}
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com/souyunku/tech/gof/NullPatternDemo.java
$ java  com.souyunku.tech.gof.NullPatternDemo
Customers
Rob
Not Available in Customer Database
Julie
Not Available in Customer Database

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

通过Mixamo生成人物动画并导入Unity实现资源可用的方法

通过Mixamo生成人物动画并导入Unity实现资源可用的方法&#xff1a; 文章要点&#xff1a; 如何通过Mixamo生成人物动画在Mixamo中生成的模型及动画导入Unity的设置&#xff08;保持原有材质&#xff09;在Unity中利用上述导入素材制作Animator 如果你有自己的人物模型&…

【Mixamo】记录mixamo导出动画踩的坑

首先说明笔者遇到的具体场景&#xff1a;由于在网上下载的模型很多都不一定适用于游戏中&#xff08;往往会出现面数过多、材质不能定制化修改等问题&#xff09;都是需要在引擎中再处理的&#xff0c;往往我们下载到本地的zip文件中只包含一个白模和一堆材质。对于笔者这样的初…

UE4 Mixamo使用教程

2020-12-17 方法一&#xff1a;&#xff08;从UE4外部导入角色到mixamo中&#xff09; 1、将模型&#xff08;.fbx等&#xff09;上传至Mixamo 2、上传完毕&#xff0c;进行简单的绑定&#xff0c;设置骨架等 3、选中需要的动作动画&#xff0c;下载&#xff08;选择.fbx&#…

Mixamo使用笔记

一、清理模型 首先要有一个模型&#xff0c;但是应该最好是Tpose的模型&#xff0c;不然容易出问题&#xff08;这里使用一个Apose做测试&#xff0c;看看是否会出问题&#xff09;而且pose一定要对称&#xff01; 之后需要将模型该合并的合并&#xff0c;该拆分的拆分&#x…

ios swift 多语言_Swift iOS CLLocationManager多合一

ios swift 多语言Apple provides many good services to clients. One of the most useful and famous function is her location detection technology. With the help of GPS and cell tower signal, iOS can manipulate the user’s current location. Many apps has utilis…

Java之I/O

目录 计算机I/0体系 计算机的存储体系 通过Java操作文件 Java操作文件类 计算机I/0体系 输入设备&#xff0c;就是用相关的硬件把信息输入到电脑中&#xff0c;比如有键盘&#xff0c;鼠标&#xff0c;麦克风等&#xff0c;标准输入设备是键盘&#xff08;将现实中的物理信…

[ROS2 入门] rqt_console 使用介绍

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们一起了解ROS 2中“Actions ”概念&#xff0c;至此最基本的核心基础概念&#xff0c;我们就都分享介绍完毕了&…

应用计算机测定磁敏电阻特性讨论,磁敏电阻工作原理及特性_磁敏电阻的电路符号与应用...

描述什么是磁敏电阻磁敏电阻是一种对磁敏感、具有磁阻效应的电阻元件。物质在磁场中电阻发生变化的现象称为磁阻效应。磁敏电阻通常用锑化铟(InSb)或砷化铟(InAs)等对磁具有敏感性的半导体材料制成。半导体材料的磁阻效应包括物理磁阻效应和几何磁阻效应&#xff0c;其中物理磁…

matlab绘图实验六,基于Matlab的开源六自由度协作机器人实验平台

一前言针对机器人相关专业的教学需求&#xff0c;商飞信息科技开发出此开源六自由度协作机器人实验平台。该平台有以下几大特色机器人本体采用自主设计的3Kg负载六自由度协作机器人&#xff0c;机器人每个关节集成电机、减速器和驱动电路&#xff0c;外观设计美观&#xff0c;适…

基于磁场数据侧信道分析的应用识别技术

&#xff08;硕士期间的一个研究点&#xff0c;希望对大家的科研有帮助&#xff09; 摘 要 移动智能终端应用于生活中的各个方面&#xff0c;感知终端上运行的应用在广告投放、限制区域内的应用监控等方面都具有重要意义。然而&#xff0c;现有技术需要系统权限来获取运行应用…

Android-APP 安全(五)之android取证-文件系统与数据结构

以下对Android 取证技术的讲解&#xff0c;整理思路取材大多来源于网络以及《Android 取证实战》一书。 Android取证&#xff1a;文件系统与数据结构 上一篇文章已简单介绍了Andorid关于存储方式以及存储路径。这篇文章会详细介绍下Andorid文件系统与数据结构。本篇涉及比较基…

Xilinx 7系列FPGA之Artix-7产品简介

数字化革命改变了对新手和有丰富经验的 FPGA 设计人员的期望。为了在航空航天和国防、通信基础设施、医疗、工业和消费电子等对成本敏感的市场中竞争&#xff0c;需要在广泛的密度范围内提供强大的高性能功能组合。在不牺牲性能的情况下&#xff0c;开发人员必须能够扩展使用模…

react常用生命周期流程图

简述 本文将常用的react生命周期绘制成了一张流程图,便于理解和记忆; react中每个组件都包含“生命周期方法”&#xff0c;我们可以重写这些方法&#xff0c;以便于在运行过程中特定的阶段执行这些方法。 react常用生命周期流程图 参考资料 生命周期图谱

System Development Life Cycle(SDLC)系统生命周期

The systems analyst creates a road map of the existing organization and systems, identifying the primary owners and users of data along with existing hardware and software. 系统分析员创建现有组织和系统的路线图&#xff0c;确定数据以及现有硬件和软件的主要所有…

android activity 回调函数,Android Activity的生命周期

Activity的生命周期Android系统根据activity的所处不同阶段对应的唤起其特定的回调函数来执行代码。activity的一系列有序的生命周期回调函数。本文将来讨论下activity各阶段生命周期的回调函数&#xff0c;以及其调用场景。basic-lifecycle.pngCreated&#xff1a; 在activity…

Bean 的生命周期

Bean 实例从创建到最后销毁&#xff0c;需要经过很多过程&#xff0c;执行很多生命周期方法。 Step1&#xff1a;调用无参构造器&#xff0c;创建实例对象。 Step2&#xff1a;调用参数的 setter&#xff0c;为属性注入值。 Step3&#xff1a;若Bean实现了BeanNameAware接口…

Vue选项式 API 的生命周期选项和组合式 API

Vue2、Vue3 生命周期的变化 正好在看Vue的官方文档&#xff0c;也正好比对一下&#xff0c;做一下笔记 选项式 API 的生命周期选项的变化 这里我们会发现Vue3对Vue2的生命周期钩子似乎没有做大的调整 修改 destroyed 生命周期选项被重命名为 unmounted beforeDestroy 生命周…

Vue3 composition-apisetup 生命周期

一. setup简单介绍 setup是组合Composition API中的入口函数&#xff0c;也是第一个要使用的函数。setup只在初始化时执行一次&#xff0c;所有的Composition API函数都在此使用。Composition API代码组织很灵活&#xff0c;代码直接全部都写在setup里面即可&#xff08;简单点…

[JavaEE]定时器

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1.定时器的概念 2.标准库中的定时器 3.实现定时…

Java方法(函数)

文章目录Java方法(函数)一、方法介绍二、方法的定义和调用格式1. 快速入门2. Debug查看方法的执行流程3. 方法调用内存图解4. 带参数方法的定义和调用1&#xff09;定义和调用格式2&#xff09;形参和实参5. 带返回值方法的定义和调用6. 方法通用定义格式三、方法常见问题四、方…