✨模式类型✨✨ | ✨✨难度✨ ✨ | ✨✨实用性✨✨ | ✨✨重要程度✨✨ | ✨✨经典性✨✨ | ✨✨历史性✨ |
---|---|---|---|---|---|
行为型模式 | ★★ ⬇️ | ★★★ ⬆️ | ★★★ ⬆️ | 💚 ⬆️ | 💚 ⬆️ |
在空对象模式(Null Object Pattern
)中,一个空对象取代 NULL
对象实例的检查。Null
对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null
对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
在大多数面向对象语言中,如Java
或C
语言,引用可能是null
。在调用任何方法之前,需要检查这些引用以确保它们不是空的,因为通常不能对空引用调用方法。
不是使用空引用来表示缺少对象(例如,不存在的客户),而是使用实现预期接口但方法体为空的对象。与工作默认实现相比,这种方法的优势在于空对象是非常可预测的,并且没有副作用:它什么也不做。
使用一个对象实现目标对象的接口或抽象类中的方法,但实现类中的方法是空实现,什么也不做。
Subject
: 目标,具有具体的业务接口方法和抽象方法的对象,这些方法定义具体的操作。NullObject
: 空对象实现,实现具体目标对象接口中的方法,但这些方法不做任何业务操作。
- 优点
- 避免显式的空检查
- 保持算法优雅且易于阅读
- 缺点
- 多维护一份代码
空对象模式的实现要点如下:
- 定义
Subject
目标接口,声明空对象模式的接口方法。 - 实现
Subject
目标接口中的所有方法,在方法中不做任何事。
空对象模式适用于:
- 希望避免显式的空检查,并保持算法的优雅和易于阅读。
- 显示的返回接口的空实现,避免空指针异常或空值检查。
java.util.Collections#emptyList()
java.util.Collections#emptyMap()
java.util.Collections#emptySet()
- 一个空对象取代
NULL
对象实例的检查,创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。 - 使用一个对象实现目标对象的接口或抽象类中的方法,但实现类中的方法是空实现,什么也不做。
- 空对象模式的优点:避免显示的检查空值,引发空指针异常;缺点是代码重复冗余,降低可维护性。
- 空对象模式适用于任何需要返回空值或传递空值、检查空值的地方。