提供一个对象[如一个代理]给给定的类型,用以代替这个对象为空的情况。 Null Object提供聪明的、什么也不做的行为,隐藏来自它的合作者的细节。
别名
Stub, Active Nothing
动机
有时,一个类需要它的一个合作者不需要做任何事。然而,类期望对待一个[什么也不做]的合作者与它对待实际上的对象提供的行为具有相同的方法。
举例来说,考虑一个显示球以移动有关荧屏的问题而且有特别的颜色效果。 这可以由创造一个球达成分类来显示球和使用一个Strategy pattern [GHJV95,第 315 页] 控制球的提议和另外的一个策略式样控制球的颜色来实现。然而, 和你开始想要产生是可能确定的最简单的策略每件事物正在工作。
现在,最简单的策略不是策略。 那就是do nothing, ,不移动而且不改变颜色。 然而,Strategy pattern 需要球有实现strategy 的接口的对象。 这是Null Object 模式变成有用的地方。 只需要简单实现不移动球的NullMovementStrategy类 和不改变球的颜色的NullColorStrategy 类。 这两个都可以实现本质上没有代码。 所有的方法在这些类中只做 "nothing" 。它们是Null Object 模式的完美例子。
Null Object 模式的关键是一个为这个类型的所有对象定义接口的抽象类。 Null Object 通过这个抽象类的子类来实现。因此它遵照抽象类的接口, 它可以在需要这个类的任何地方型来使用。当作比拟为使用不实际上实现抽象的接口特别的 "null"的值和一定不变地被检查为由于特别的代码在使用抽象的接口任何的对象中。
一般会认为 Null Objects 是过于简单和 "愚蠢"的 ,但是在事实上一个 Null Objects 在没有任何其他的对象互相影响的情况下,总是很确切的知道需要去做什么。 因此,事实上它是最"智能"的。
适用性
在以下情况下使用Null Object模式
; 一个对象需要一个合作者。 Null Object 将不被引入这个合作体系--它利用已经存在的合作者。
; 一些合作者的实例应该什么也不做。
结 构
参与者 Client 需要一个合作者 AbstractObject 声明Client合作者的接口 适当的在所有类中实现接口默认行为 RealObject 定义一个AbstractObject的子类,它的实例实现Client预期的有用的行为 定义AbstractObject 的一个具体的子类提供客户预期的有用行为 NullObject 提供一个与 AbstractObject 一致的接口,使得这个空对象可以替代真实的对象 使接口中的方法 “do nothing” 当不止一种方法“do nothing”时,就需要相同数量的空对象
本文地址:http://com.8s8s.com/it/it36815.htm