Joh*_*lph 4 design-patterns null-object-pattern poeaa
为什么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
}
}
Run Code Online (Sandbox Code Playgroud)
INull用作标记界面.我不喜欢这种方法有三个原因:
为什么不像这样实现:
public class Customer
{
public static readonly Customer NullCustomer = new Customer(){Name = "ImtTheNullCustomer";}
public string Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我一般都认为福勒的所有例子都经过深思熟虑,显然我必须在这里找到一些东西.
Cha*_*hap 10
继承的原因是覆盖类的行为.你在考虑它的方式在我看来就像你要检查你所拥有的对象是否等于NullCustomer静态实例来做出决定,但是null对象的要点是坚持Liskov的替换原则.
换句话说,您使用null对象来设置引用,并且您将不会对其进行特殊检查,您将只使用它并且它应该具有不同的行为(实际上缺乏行为).