空对象模式

devtools/2025/1/11 22:38:23/

在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。

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

实现

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

null_pattern_uml_diagram

创建 AbstractCustomer 抽象类。

java">public abstract class AbstractCustomer {protected String name;public abstract boolean isNil();public abstract String getName();
}

RealCustomer 继承 AbstractCustomer 对其进行扩展:

java">public class RealCustomer extends AbstractCustomer {public RealCustomer(String name) {this.name = name;    }@Overridepublic String getName() {return name;}@Overridepublic boolean isNil() {return false;}
}

NullCustomer 继承 AbstractCustomer 对其进行扩展:

java">public class NullCustomer extends AbstractCustomer {@Overridepublic String getName() {return "Not Available in Customer Database";}@Overridepublic boolean isNil() {return true;}
}

创建 CustomerFactory 类:

java">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();}
}

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

java">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">Customers
Rob
Not Available in Customer Database
Julie
Not Available in Customer Database

http://www.ppmy.cn/devtools/149711.html

相关文章

Spring Boot3 配合ProxySQL实现对 MySQL 主从同步的读写分离和负载均衡

将 ProxySQL 配合 Spring Boot 使用&#xff0c;主要的目的是在 Spring Boot 应用程序中实现对 MySQL 主从同步的读写分离和负载均衡。这样&#xff0c;你可以利用 ProxySQL 自动将写操作路由到主库&#xff0c;而将读操作路由到从库。 1. 准备工作 确保你的 MySQL 主从同步环…

在FreeBSD、Windows、Ubuntu24三种平台下安装Racket

Racket 简介 Racket 是一种多范式编程语言&#xff0c;源自 Scheme 语言&#xff0c;主要用于教学、研究和软件开发。它具有以下几个显著特点&#xff1a; 多范式支持&#xff1a;Racket 支持函数式编程、命令式编程和面向对象编程&#xff0c;允许开发者根据需求选择合适的编…

【CSS】设置滚动条样式

文章目录 基本语法用法案例 基本语法 在CSS中&#xff0c;可以使用 ::-webkit-scrollbar 和相关伪元素来为滚动条设置样式&#xff0c;但请注意这些伪元素是非标准的&#xff0c;主要用于WebKit内核浏览器&#xff08;如Chrome、Safari&#xff09;。 ::-webkit-scrollbar CSS …

针对数据库系统安全的漏洞扫描加固工具【WebSocket + MySQL】

一、系统背景 随着信息技术的迅猛发展和互联网的普及&#xff0c;数据库作为存储、管理和检索大量数据的关键组件&#xff0c;其安全性对于企业和组织来说至关重要。然而&#xff0c;由于网络环境的复杂性和攻击手段的多样性&#xff0c;数据库面临着越来越多的安全威胁&#…

NLP三大特征抽取器:CNN、RNN与Transformer全面解析

引言 自然语言处理&#xff08;NLP&#xff09;领域的快速发展离不开深度学习技术的推动。随着应用需求的不断增加&#xff0c;如何高效地从文本中抽取特征成为NLP研究中的核心问题。深度学习中三大主要特征抽取器——卷积神经网络&#xff08;Convolutional Neural Network, …

WebSocket介绍与使用

1.简介 在我们平时写的web项目中&#xff0c;大多是使用http协议&#xff0c;但是http协议是典型的一问一答的模式&#xff0c;只能由客户端向服务器发送请求&#xff0c;再由服务器返回响应&#xff0c;但实际开发中&#xff0c;很多场景都需要服务器主动发送消息给服务端&am…

C#Halcon找线封装

利用CreateMetrologyModel封装找线工具时&#xff0c;在后期实际应用调试时容易把检测极性搞混乱&#xff0c;造成检测偏差&#xff0c;基于此&#xff0c;此Demo增加画线后检测极性的指引&#xff0c;首先看一下效果 加载测试图片 画线 确定后指引效果 找线效果 修改显示 UI代…

探索Java爬虫:获取淘宝App商品详情原数据API接口的实现

在当今的互联网时代&#xff0c;数据是最宝贵的资源之一。对于电商平台而言&#xff0c;商品详情数据更是重中之重。本文将带你深入了解如何使用Java爬虫获取淘宝App商品详情的原数据API接口&#xff0c;帮助你掌握这一技术&#xff0c;提升数据获取能力。 一、为什么选择Java…