意图

通过对缺失对象的封装,以提供默认无任何行为的对象替代品。

Encapsulate the absence of an object by providing a substitutable alternative
that offers suitable default do nothing behavior.

In short, a design where “nothing will come of nothing”.

结构

352014475871.png

参与者

AbstractObject

  • 声明协作对象的接口。

  • 如果需要,可以实现默认行为。

RealObject

  • 具体的协作对象类,提供有意义的行为。

NullObject

  • 空对象类,继承自 AbstractObject,但接口实现不做任何事情。

Client

  • 请求协作对象。

适用性

当以下情况成立时可以使用 Null Object 模式:

  • 一个对象需要一个协作对象,但并无具体的协作对象。

  • 协作对象不需要做任何事情。

效果

  • 减少了对对象是否为 Null 的判断。

  • 提供默认无任何具体行为的协作对象。

相关模式

  • 因为 Null Object 通常没有任何状态,所以多个实例可能都是类似的,可以使用
    Singleton
    模式来实现。

  • Null Object 看起来很像
    Proxy
    模式,但两者有着不同的目的。Proxy 提供对目标对象访问的控制,而 Null Object
    并不隐藏任何对象。

  • Null Object 可以作为
    Strategy
    模式中的一个特例。Strategy 提供多个具体类以区分算法,而 NullStrategy
    则可不做任何事情。

  • Null Object 可以作为
    State
    模式中的一个特例。使用 NullState 以便不做任何事情。


  • Visitor
    模式中也可以使用 Null Object 以提供某种默认行为。

Implementation

1
2
3
public abstract class AbstractOperation {
abstract void request();
}
1
2
3
4
5
6
public class RealOperation extends AbstractOperation {
@Override
void request() {
System.out.println("do something");
}
}
1
2
3
4
5
6
public class NullOperation extends AbstractOperation{
@Override
void request() {
// do nothing
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {
public static void main(String[] args) {
AbstractOperation abstractOperation = func(-1);
abstractOperation.request();
}

public static AbstractOperation func(int para) {
if (para < 0) {
return new NullOperation();
}
return new RealOperation();
}
}