zl程序教程

您现在的位置是:首页 >  后端

当前栏目

漫谈模式之空对象模式

对象模式 漫谈
2023-06-13 09:18:23 时间

本文我们来介绍一下空对象模式(Null Object Pattern)

空对象模式(Null Object Pattern)是一种设计模式,用于处理对象不存在的情况,它通过返回一个空对象来代替 null 值,从而避免了空指针异常。空对象通常具有与正常对象相同的接口,但其方法体为空或返回默认值。

空对象模式的基本介绍

意图

它通过返回一个空对象来代替 null 值,从而避免了空指针异常。空对象通常具有与正常对象相同的接口,但其方法体为空或返回默认值。

结构

空对象模式的结构大致如下:

这里涉及到的参与者有如下几种:

AbstractObject(抽象类或接口)

定义了需要使用空对象模式的方法。

RealObject(具体类)

实现了抽象类或接口,并返回具体的对象或空对象。

NullObject(空对象类)

实现了抽象类或接口,表示一个不执行任何操作或返回任何值的对象。

Client(客户端)

使用具体类或空对象来执行方法。

空对象模式的示例

接下来,我们简单给出空对象使用示例。

示例、日志打印

定义一个抽象的日志类

具体日志类

空对象日志类

方便增加一个日志对象工厂

客户端Client

在Client中,我们先创建了一个Console日志,然后记录日志;接着,创建一个空对象日志,用于模拟空操作。

上述引入空对象的好处是:我们能够保证日志打印的一致性,在不一样的场景中,只要创建需要的日志打印对象即可。

输出结果

一般情况下,空对象类一般采用2种方式来处理:

  • 使用public static final 修饰,定义一个全局常量

如:

  public static final AbstarctLogger NOP_INSTANCE =                                       new NullLogger2();
  • 使用单例方式

如:

这样,一个简单的空对象示例就完成了。

其实,空对象还能在很多场景使用,比如,缓存对象。比如,有时候我们需要做相关的灰度切流,就需要灰度一部分流量调用新的接口。此时,我们也可以使用空对象。这样,我们针对未开启灰度的业务,缓存存储空对象,可以避免缓存击穿,也就是查缓存,未找到结果又查了数据库。可以结合工厂和策略,完成相关的操作。比如:空对象调用旧接口;如不是则调用新接口。

其它

优缺点

优点

  • 代码复用性高:通过使用空对象模式,可以在多个地方共享同一个空对象,避免了代码重复。
  • 程序可读性好:使用空对象模式可以使程序更加清晰易懂,因为我们可以将空对象的行为定义为默认行为,而不是在各种条件下进行特殊处理。
  • 更好的可扩展性:空对象模式能够支持新的对象类型,而不需要修改原有的代码。

缺点

  • 有可能降低程序的性能,因为需要多次进行对象比较,以判断是否为一个空对象。
  • 当应用程序需要高度定制的空对象时,空对象模式可能不够灵活。
  • 空对象模式可能需要对代码进行重构,以适应空对象的引入,增加了开发成本。

适用场景

Null Object pattern适用于以下情况:

  • 需要在某些地方使用默认行为,但是又不希望使用null来表示缺失的对象时。使用Null Object模式,可以使用默认对象来代替缺失的对象。
  • 需要减少代码中对null的检查和处理时。使用Null Object模式,可以避免对null的检查和处理,从而减少代码中的冗余。
  • 需要在运行时动态地替换对象时。使用Null Object模式,可以在运行时动态地替换对象,从而实现一些特殊的行为。