23-Java空对象模式 ( Null Object Pattern )

Java空对象模式

    • 实现
    • 范例

  • 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查
  • Null 对象不是检查空值,而是反应一个不做任何动作的关系,这样的 Null 对象也可以在数据不可用的时候提供默认的行为。
  • 在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方

实现

在这里插入图片描述

  • 我们将创建一个定义操作(在这里,是客户的名称)的 AbstractCustomer 抽象类,和扩展了 AbstractCustomer 类的实体类
  • 工厂类CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象
  • NullPatternDemo ,我们的演示类使用 CustomerFactory 来演示空对象模式的用法

范例

1. 创建一个抽象类 AbstractCustomer

AbstractCustomer.java

package com.demo.gof;
public abstract class AbstractCustomer{
   protected String name;
   public abstract boolean isNil();
   public abstract String getName();
}

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

RealCustomer.java

package com.demo.gof;
public class RealCustomer extends AbstractCustomer{

   public RealCustomer(String name) {
      this.name = name;     
   }

   @Override
   public String getName() {
      return name;
   }

   @Override
   public boolean isNil() {
      return false;
   }
}

NullCustomer.java

package com.demo.gof;
public class NullCustomer extends AbstractCustomer {

   @Override
   public String getName() {
      return "Not Available in Customer Database";
   }

   @Override
   public boolean isNil() {
      return true;
   }
}

3. 创建 CustomerFactory 类

CustomerFactory.java

package com.demo.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 对象

NullPatternDemo.java

package com.demo.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.demo/gof/NullPatternDemo.java
$ java  com.demo.gof.NullPatternDemo
Customers
Rob
Not Available in Customer Database
Julie
Not Available in Customer Database


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

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

相关文章

1. OSPF 基础实验(三):邻接关系和 LSA

1.3 OSPF 的邻接关系和 LSA 1.3.1 实验介绍 1.3.1.1 学习目标 1. 阐明在多路访问网络中接入多台路由器时的邻居关系建立过程 2. 控制 OSPF DR 的选举 3. 描述 5 种类型的 LSA 的内容&#xff0c;以及它们的作用 1.3.1.2 实验组网介绍 设备互联方式及 IP 地址规划如图所示…

NASA数据集——亚马逊盆地与其大气边界层之间各种气溶胶和气体交换率的估计值数据

简介 Pre-LBA ABLE-2A and ABLE-2B Expedition Data ABLE 2A 和 2B&#xff08;大气边界层实验&#xff09;数据包括亚马逊盆地与其大气边界层之间各种气溶胶和气体交换率的估计值&#xff0c;以及这些气溶胶和气体在边界层和自由对流层之间的移动过程。前言 – 人工智能教程…

【五】【算法分析与设计】双指针的初见

167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index(1)] 和 numbers[index(2)] &#xff0c;则 1 &…

Java项目源码基于springboot的家政服务平台的设计与实现

大家好我是程序员阿存&#xff0c;在java圈的辛苦码农。辛辛苦苦板砖&#xff0c;今天要和大家聊的是一款Java项目源码基于springboot的家政服务平台的设计与实现&#xff0c;项目源码以及部署相关请联系存哥&#xff0c;文末附上联系信息 。 项目源码&#xff1a;Java基于spr…

[计算机效率] 便笺的使用

2.4 便笺 便笺程序是一种方便用户记录、查看和编辑便签的简单应用程序。在Windows系统中&#xff0c;便笺通常作为系统自带的实用工具之一&#xff0c;可以帮助用户快速创建、编辑和组织便签&#xff0c;以便随时记录重要的信息、任务或提醒事项。 便笺程序通常具有以下特点&a…

岩土工程监测中振弦采集仪的选型指南与市场概况

岩土工程监测中振弦采集仪的选型指南与市场概况 振弦采集仪是岩土工程监测中常用的一种设备&#xff0c;用于测量土体的振动特性。它的选型指南和市场概况如下&#xff1a; 选型指南&#xff1a; 1. 测量参数&#xff1a;振弦采集仪可用于测量土体的振动振幅、频率、相位等参数…

美团2025春招第一次笔试题

第四题 题目描述 塔子哥拿到了一个大小为的数组&#xff0c;她希望删除一个区间后&#xff0c;使得剩余所有元素的乘积未尾至少有k个0。塔子哥想知道&#xff0c;一共有多少种不同的删除方案? 输入描述 第一行输入两个正整数 n,k 第二行输入n个正整数 a_i&#xff0c;代表…

OpenHarmony开发—购物示例应用

介绍 本示例展示在进场时加载进场动画&#xff0c;整体使用Tabs容器设计应用框架&#xff0c;通过TabContent组件设置分页面&#xff0c;在子页面中绘制界面。通过Navigation完成页面之间的切换。在详情页中通过 Video组件加载视频资源&#xff0c;使用CustomDialogController…

力扣刷题日记——L66.加一

1. 前言&#xff1a; 从今天开始打卡力扣&#xff0c;每天一道力扣题&#xff0c;然后将解题思路分享出来&#xff0c;纯原创。 2. 题目描述 给定一个由 整数 ****组成的 ****非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#…

使用API有效率地管理Dynadot域名,使用API设置域名隐私保护

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

SiT技术报告阅读

论文链接&#xff1a;SiT: Exploring Flow and Diffusion-based Generative Models with Scalable Interpolant Transformers 报告链接&#xff1a;https://scalable-interpolant.github.io/ 文章目录 IntroFlow and DiffusionDiffusion-Based ModelsStochastic Interpolant an…

GPT出现Too many requests in 1 hour. Try again later.

换节点 这个就不用多说了&#xff0c;你都可以上GPT帐号了&#xff0c;哈…… 清除cooki 然后退出账号&#xff0c;重新登录即可

应用工程中获取Shapefile文件的图形信息并显示

本文用纯前端获取shp文件以及前后端交互的方式获取Shapefile文件中的图形信息 1.案例说明 在日常的WebGIS开发中&#xff0c;我们往往会面对&#xff0c;需要用户选择矢量数据&#xff0c;通过矢量数据中的空间范围信息&#xff0c;显示在界面上&#xff0c;并给用户的下一步…

wave库基本操作

wave 常见的语音信号处理python库有librosa, scipy, soundfile等等。wave库是python的标准库&#xff0c;对于python来说相对底层&#xff0c;wave不支持压缩/解压&#xff0c;但支持单声道/立体声语音的读取。 读取音频 import wavefile_path D:/ba.wav #文件路径 f wave…

数据库应用

约束 概念&#xff1a; 约束是一种限制&#xff0c;它通过对表的行或列的数据做出限制&#xff0c;来确保表的数据的正确性、完整性、有效性、唯一性。 分类&#xff1a; primary key&#xff1a;主键约束&#xff0c;指定某列的数据不能重复、唯一、非空。 not null&#…

QT----计算器

目录 1 搭建标准界面2、 逻辑编写2.1 初始化 github链接&#xff1a;基于qt的计算器 1 搭建标准界面 按照下图搭设界面 修改样式让这计算器看起来更像一点&#xff0c;同时对按钮分组进行样式编辑&#xff0c;添加字符串name,为number&#xff0c;其他按键为other。之前的文章…

Linux操作系统-07-Linux安装应用

一、使用rpm安装应用&#xff08;不推荐&#xff09; 先下载到本地&#xff0c;以.rpm文件名结尾&#xff0c;下载完成后&#xff0c;再安装 rpm -qa | grep mysql #查询当前系统是否有下载过mysql包 先上传mysql的rpm安装包到linux的opt目录 安装 rpm -ivh …

CVE-2024-27199 JetBrains TeamCity 身份验证绕过漏洞2

漏洞简介 TeamCity Web 服务器中发现了第二个身份验证绕过漏洞。这种身份验证旁路允许在没有身份验证的情况下访问有限数量的经过身份验证的端点。未经身份验证的攻击者可以利用此漏洞修改服务器上有限数量的系统设置&#xff0c;并泄露服务器上有限数量的敏感信息。 项目官网…

3D模型优化10个最佳实践

对于许多在建模、渲染和动画方面经验丰富的 3D 建模者来说&#xff0c;3D 优化可能是一个令人畏惧的过程 - 特别是当你正在优化实时应用程序的 3D 模型时&#xff01; 在 Google 上快速搜索“如何优化 3D 文件”将会出现一些建议&#xff0c;例如减少多边形数和消除多余的顶点。…

【MATLAB 】 EMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 EMD信号分解算法 EMD 分解又叫经验模态分解&#xff0c;英文全称为 Empirical Mode Decomposition。 EMD 是一种信号分解方法&#xff0c;它将一个信号分解成有限个本质模态函数 (EMD) 的和&#xff0c…