第一次听说这个模式,这个模式看起来好像很简单,但是实际用起来还是有点不太容易理解。
我们在代码里经常会进行null检查,这种检查是易出错的,假设我们在代码里对null的情况也需要作出响应,Null Object模式就显示出它的优点。
可以看一下这个例子:
Employee e = DB.GetEmployee("Bob");
if (e != null && e.IsTimeToPay(today))
e.Pay();
我们对这段代码进行优化,采用Null Object模式,当DB.GetEmployee在数据库中找到一个雇员时,就返回EmployeeImplementation的实例。仅当DB.GetEmployee在数据库中没有找到雇员时才返回NullEmployee的实例,结构代码如下,
public abstract class Employee
{
public abstract bool IsTimeToPay(DateTime time);
public abstract void Pay();
public static readonly Employee NULL =
new NullEmployee();
private class NullEmployee : Employee
{
public override bool IsTimeToPay(DateTime time)
{
return false;
}
public override void Pay()
{
}
}
}
public class DB
{
public static Employee GetEmployee(string s)
{
return Employee.NULL;
}
}
这个时候我们的代码就可以优化成如下代码,省去了晦涩的e != null
Employee e = DB.GetEmployee("Bob");
if (e.IsTimeToPay(today))
e.Pay();
可以在你的代码里试试这个Null Object模式O(∩_∩)O
我们在代码里经常会进行null检查,这种检查是易出错的,假设我们在代码里对null的情况也需要作出响应,Null Object模式就显示出它的优点。
可以看一下这个例子:
Employee e = DB.GetEmployee("Bob");
if (e != null && e.IsTimeToPay(today))
e.Pay();
我们对这段代码进行优化,采用Null Object模式,当DB.GetEmployee在数据库中找到一个雇员时,就返回EmployeeImplementation的实例。仅当DB.GetEmployee在数据库中没有找到雇员时才返回NullEmployee的实例,结构代码如下,
![](http://bbs:81/data/attachment/album/201208/21/104538xfrbffpbdg903ofg.png)
public abstract class Employee
{
public abstract bool IsTimeToPay(DateTime time);
public abstract void Pay();
public static readonly Employee NULL =
new NullEmployee();
private class NullEmployee : Employee
{
public override bool IsTimeToPay(DateTime time)
{
return false;
}
public override void Pay()
{
}
}
}
public class DB
{
public static Employee GetEmployee(string s)
{
return Employee.NULL;
}
}
这个时候我们的代码就可以优化成如下代码,省去了晦涩的e != null
Employee e = DB.GetEmployee("Bob");
if (e.IsTimeToPay(today))
e.Pay();
可以在你的代码里试试这个Null Object模式O(∩_∩)O