空对象模式【Java设计模式】

简介: 空对象模式【Java设计模式】

前言


2022/9/25 18:56

2022/9/25 19:19

路漫漫其修远兮,吾将上下而求索


本文是根据袁庭新老师学习所做笔记

仅供学习交流使用,转载注明出处


推荐

袁庭新老师-视频:【Java设计模式】23种Java设计模式,全网最全精讲版本,熬夜爆肝也要学完【10:06:48】

狂神老师-笔记:设计模式【java提高】

空对象模式

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


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

实现

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


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


1.创建一个项目名称为null_object_pattern的Java项目。

2.创建一个AbstractCustomer抽象类。

package com.js;
/**
 * 定义一个抽象类
 */
public abstract class AbstractCustomer {
    public String name;
    //是否是空值
    public abstract boolean isNil();
    //获取名称
    public abstract String getName();
}

3.创建上述类的实现类

package com.js;
/**
 * 表示目标要操作的类
 */
public class RealCustomer extends AbstractCustomer{
    public RealCustomer(String name) {
        this.name=name;
    }
    @Override
    public boolean isNil() {
        return false;
    }
    @Override
    public String getName() {
        return name;
    }
}
package com.js;
public class NullCustomer extends AbstractCustomer{
    @Override
    public boolean isNil() {
        return true;//是空值
    }
    @Override
    public String getName() {
        return "没有定义当前的对象";
    }
}

4.创建工厂

package com.js;
public class CustomerFactory {
    private  static final String[] names={"tom","jack","coco"};
    //定义一个方法,根据用户传递的名称来判断当前是否存在此客户
    //如果不存在,则抛出指定空对象(NullCustomer)
    public static AbstractCustomer getCustomer(String name){
        for (int i = 0; i < names.length; i++) {
            //如果if成立,则表示目标访问的对象存在(RealCustomer)
            if (names[i].equalsIgnoreCase(name)){
                return new RealCustomer(name);
            }
        }
        return new NullCustomer();//彻底避免Null对象的产生
    }
}

5.编写客户端

package com.js;
public class NullObjectPattern {
    public static void main(String[] args) {
        AbstractCustomer c1 = CustomerFactory.getCustomer("tom");
        System.out.println(c1.getName());
        AbstractCustomer c2 = CustomerFactory.getCustomer("marry");
        System.out.println(c2.getName());
    }
}

6.结果

tom
没有定义当前的对象

最后


2022/9/25 20:12


p15


Markdown 2109 字数 163 行数

HTML 1834 字数 90 段落

相关文章
|
10天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
12天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
12天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
16天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
36 17
|
5天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
18 1
|
15天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
17天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
33 0
[Java]23种设计模式
|
24天前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
23 6
|
1天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
15天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
11 0