2

我已经看到了两种不同的方法来实现空对象模式。

一个示例具有从第三个抽象基类继承的具体类和空类。

第二个示例显示了直接从具体类继承的空对象类。

而第二个示例的优点是可以为每种类型的对象处理更少的类;这种方法有什么潜在的陷阱吗?

4

3 回答 3

0

这两个例子是相似的。第一个示例处理值对象的空值,客户,第二个示例处理对象的空值,其行为通常在模板或策略设计模式中找到。

如果你仔细看,你会发现这两个例子都返回了对超类的引用,而返回的具体空对象实际上保护了客户端免受空指针异常的影响。

于 2013-07-14T13:48:51.607 回答
0

我会以第一个例子结束。

实际上,从具体类(第二个示例)继承是冒险违反一般情况下的Liskov 替换原则的最佳方式,尤其是对于空对象模式的概念。

于 2013-07-14T13:49:06.090 回答
0

具体类可能包含数据和方法。null 对象可能不需要任何(或至少不需要那么多)成员数据,并且它需要覆盖许多方法以便它们什么都不做(因此不会从继承这些的具体实现中获得任何好处)。

如果 null 对象本身是一个单例,那么它包含和覆盖来自具体类的所有这些内容的开销可能并不重要(这很浪费,但这种浪费只有一个实例),并且实现该方法可能更简单从第二个例子。但是第一个示例可能更受欢迎,因为它避免了创建一个继承大量它不想要或不需要的东西的类。

请注意,在支持接口的语言(如 Java 和 C#)中,具体类型和 null 类型可能都实现了相同的接口,但没有任何直接继承关系。这比抽象基类更进一步。

于 2013-07-14T14:08:11.337 回答