Employee e = DB.GetEmployee(“Bob”);

If(e != null && e.IsTimeToday(today))

 e.Pay();

上述代码的用法很常见,我们从数据库中查找名为Bob的员工,如果该对象不存在,返回null,如果存在,判断是它的发薪日,就调用Pay方法。&&操作可以保证仅当第一个表达式为真时才执行第二个表达式。然而有些时候我们总会忘记对null的检查而导致程序出错。有什么方法可以避免这些判断语句呢?这里可以提供一种解决方案,即NULL OBJECT模式。NULL OBJECT模式提供了当对象为空时的行为,但是它什么也没有做。灵活的使用NULL OBJECT模式可以简化我们的代码。

对于如何理解和应用NULL OBJECT模式,以一个简单的例子来说明一下。

Code

有了上面的类,我们在程序中就可以这样来应用:

Book b = DB.GetBookByID(“1000”);

If(b. Borrowable())

{

       b.Borrow();

}

由上可以看出,在程序中我们可以直接使用Book的实例,而不用判断它的引用是否为空,因为无论如何,它都返回一个有效的对象。在以前的代码中,如果调用Book的地方很多,那么每个地方都会充斥着判断其引用是否为空的代码。有了NULL OBJECT我们的代码精简了不少。

FCL中也有用NULL OBJECT模式的例子。在System.IO中关于Stream的实现中就用到了该模式,我们来看看它的实现:

Code

 

posted on 2009-01-05 20:46  清水无痕  阅读(1253)  评论(2编辑  收藏  举报