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 class DB 

  
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(); 
  }
 
}
 


其中 IsNull 是 Nullable 接口的成员,在需要判断对象是否为NullObject时,只要执行  employee.IsNull 就可以了。

posted @ 2005-11-05 22:35  quitgame  阅读(1811)  评论(2编辑  收藏  举报