写点什么

空对象模式(Null Object Pattern)

作者:Tom弹架构
  • 2021 年 11 月 25 日
  • 本文字数:1592 字

    阅读完需:约 5 分钟

本文节选自《设计模式就该这样学》

1 空对象模式的定义

空对象模式(Null Object Pattern)不属于 GoF 设计模式,但是它作为一种经常出现的模式足以被视为设计模式了。其具体定义为设计一个空对象取代 NULL 对象实例的检查。NULL 对象不是检查控制,而是反映一个不做任何动作的关系。这样的 NULL 对象也可以在数据不可用的时候提供默认的行为,属于行为型设计模式。


原文:Provide an object as a surrogate for the lack of an object of a given type. The Null object provides intelligent do nothing behavior, hiding the details from its collaborators.

2 空对象模式的应用场景

空对象模式适用于以下应用场景。


(1)对象实例需要一个协作实例。空对象模式不会引入协作实例,它只是使用现有的协作实例。


(2)部分协作实例不需要做任何处理。


(3)从客户端中将对象实例不存在的代码逻辑抽象出来。

3 空对象模式的 UML 类图

空对象模式的 UML 类图如下图所示。



由上图可以看到,空对象模式主要包含 3 个角色。


(1)抽象对象(AbstractObject):定义所有子类公有的行为和属性。


(2)真实对象(RealObject):继承 AbstractObject 类,并实现所有行为。


(3)空对象(NullObject):继承 AbstractObject 类,对父类方法和属性不做实现和赋值。

4 空对象模式的通用写法

以下是空对象模式的通用写法。



public class Client {
public static void main(String[] args) { ObjectFactory factory = new ObjectFactory(); System.out.println(factory.getObject("Joe").isNill()); System.out.println(factory.getObject("Tom").isNill()); }

//抽象对象 static abstract class AbstractObject{ abstract void request(); abstract boolean isNill(); }
//空对象 static class NullObject extends AbstractObject{
public void request() { System.out.println("Not Available Request"); }
boolean isNill() { return true; } }
//真实对象 static class RealObject extends AbstractObject{ private String name; public RealObject(String name) { this.name = name; }
public void request() { System.out.println("Do samething..."); }
boolean isNill() { return false; } }
//对象工厂 static class ObjectFactory{ private static final String[] names = {"Tom","Mic","James"};
public AbstractObject getObject(String name){ for (String n : names) { if(n.equalsIgnoreCase(name)){ return new RealObject(name); } } return new NullObject(); } }}
复制代码

5 空对象模式的优点


(1)它可以加强系统的稳固性,能有效地减少空指针报错对整个系统的影响,使系统更加稳定。


(2)它能够实现对空对象情况的定制化的控制,掌握处理空对象的主动权。


(3)它并不依靠 Client 来保证整个系统的稳定运行。


(4)它通过定义 isNull()对使用条件语句==null 的替换,显得更加优雅,更加易懂。

6 空对象模式的缺点


每一个要返回的真实的实体都要建立一个对应的空对象模型,那样会增加类的数量。


关注微信公众号『 Tom 弹架构 』回复“设计模式”可获取完整源码。


【推荐】Tom弹架构:30个设计模式真实案例(附源码),挑战年薪60W不是梦


本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!

如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。关注微信公众号『 Tom 弹架构 』可获取更多技术干货!

发布于: 1 小时前阅读数: 5
用户头像

Tom弹架构

关注

不只做一个技术者,更要做一个思考者 2021.10.22 加入

畅销书作者,代表作品:《Spring 5核心原理》、《Netty 4核心原理》、《设计模式就该这样学》

评论

发布
暂无评论
空对象模式(Null Object Pattern)