【发布时间】:2009-11-10 17:42:14
【问题描述】:
为什么 Fowler PoEAA p. 498 用以下方式定义空对象模式(示例缩短,语言是c#但没关系):
public class Customer
{
public virtual string Name {get; set;}
}
public class NullCustomer : Customer, INull
{
public override Name
{
get { return "ImTheNull";}
// setter ommitted
}
}
INull 用作标记接口。
我不太喜欢这种方法,原因有以下三个:
- 属性需要标记为虚拟
- 我不能再密封我的实体类了
- 至少引入了 (n+1) 个新类型(n 个空对象,一个标记接口)
为什么不这样实现:
public class Customer
{
public static readonly Customer NullCustomer = new Customer(){Name = "ImtTheNullCustomer";}
public string Name {get; set;}
}
我普遍认为所有 Fowlers 的例子都经过深思熟虑,显然我在这里错过了一些东西。
【问题讨论】:
-
不要将方法设为虚拟,或出于这个原因让类处于未密封状态。虽然我非常尊重 Martin Fowler,但在他的许多涉及继承的示例中都存在明显的 Java 偏见。在 Java 中,方法默认是虚拟的。在 C# 中它们不是,并且该设计决策是专门由于默认虚拟方法的感知问题而做出的。无论如何,如果 NullCustomer 是有效客户,请使用此模式。一个好的指标是将其与空列表进行比较。一个空列表是一个非常好的列表,并且传播它没有害处。这可能不是这里的情况。
标签: design-patterns null-object-pattern poeaa