我已经看到了两种不同的方法来实现空对象模式。
first example具有继承自第三个抽象基类的具体类和null类。
second example显示直接从具体类继承的null对象类。
虽然第二个例子的优点是可以为每种类型的对象处理一个较少的类;这种方法有什么潜在的缺陷吗?
答案 0 :(得分:0)
两个例子都很相似。虽然第一个示例处理值对象的归零,但第二个示例处理对象的无效性,这通常在模板或策略设计模式中找到。
如果仔细观察,您会发现两个示例都返回对超类的引用,而返回的具体null对象实际上保护客户端免受Null Pointer Exception的影响。
答案 1 :(得分:0)
我最后会得到第一个例子。
实际上,继承一个具体的类(第二个例子)是冒一般违反Liskov Substitution Principle风险的最好方法,特别是对于空对象模式的概念。
答案 2 :(得分:0)
具体类可能包含数据和方法。 null对象可能不需要任何(或至少没有那么多)成员数据,并且它需要覆盖许多方法,以便它们什么都不做(因此继承这些方法的具体实现不会有任何好处) )。
如果null对象本身就是一个单例,那么它包含并覆盖具体类中所有这些内容的开销可能并不重要(这很浪费,但只有一个这样的浪费),它可能更简单实现第二个例子的方法。但是第一个例子可能是首选,因为它避免了创建一个继承了它不需要或不需要的东西的类。
请注意,在支持接口的语言(例如Java和C#)中,具体类型和null类型可能都实现相同的接口,但没有任何直接继承关系。这是抽象基类的又一步。