Null Object 模式和实现
意图
提供一个对象[如一个代理]给给定的类型,用以代替这个对象为空的情况。 Null Object提供聪明的、什么也不做的行为,隐藏来自它的合作者的细节。
别名
Stub, Active Nothing
动机
有时,一个类需要它的一个合作者不需要做任何事。然而,类期望对待一个[什么也不做]的合作者与它对待实际上的对象提供的行为具有相同的方法。
举例来说,考虑一个显示球以移动有关荧屏的问题而且有特别的颜色效果。 这可以由创造一个球达成分类来显示球和使用一个Strategy pattern [GHJV95,第 315 页] 控制球的提议和另外的一个策略式样控制球的颜色来实现。然而, 和你开始想要产生是可能确定的最简单的策略每件事物正在工作。
…………………………………………………………
以上全文见 http://www.cnbug.com/Article/{82E30447-B3D9-4FE4-965B-5F5A4975D24A}.htm
在《敏捷软件开发--原则、模式、实践》 一书中看到了一个非常优雅的实现,不过是基于 Java 的, C# 中目前好像没有办法实现, 因为其中使用了匿名内部类
import java.util.Date;
public interface Employee
{
public boolean isTimeToPay(Date payDate);
public void pay();
public static final Employee NULL = new Employee()
{
public boolean isTimeToPay(Date payDate)
{
return false ;
}
public void pay()
{
}
};
}
public interface Employee
{
public boolean isTimeToPay(Date payDate);
public void pay();
public static final Employee NULL = new Employee()
{
public boolean isTimeToPay(Date payDate)
{
return false ;
}
public void pay()
{
}
};
}
其调用代码如下
public class DB
{
public static Employee getEmployee(string name)
{
return Employee.NULL ;
}
}
{
public static Employee getEmployee(string name)
{
return Employee.NULL ;
}
}
这样写有一个无可比拟的好处,那就是 Employee.Null 对象天生就是 Singleton 的 , 任何一个 Employee实例只要执行 employee.equals( Employee.NULL )j就可以判断出是否为 NullObject
那么 在C# 如何实现呢?
无须使用 匿名内部类, 在 Martin Fowler 的《重构》一书中,提到了一个更通用的实现
public interface IEmployee : INullable
{
public bool IsTimeToPay{get;}
public void Pay();
public bool IsNull{get;}
}
public class NullEmployee : IEmployee
{
public bool IsTimeToPay
{
get{return false;}
}
public void Pay
{
}
public bool IsNull
{
get{return true ;}
}
}
// 调用方法
public class DB
{
public static IEmployee GetEmployee(string name)
{
return new NullEmployee();
}
}
{
public bool IsTimeToPay{get;}
public void Pay();
public bool IsNull{get;}
}
public class NullEmployee : IEmployee
{
public bool IsTimeToPay
{
get{return false;}
}
public void Pay
{
}
public bool IsNull
{
get{return true ;}
}
}
// 调用方法
public class DB
{
public static IEmployee GetEmployee(string name)
{
return new NullEmployee();
}
}
其中 IsNull 是 Nullable 接口的成员,在需要判断对象是否为NullObject时,只要执行 employee.IsNull 就可以了。