空对象模式

  在开发业务层数据的时候,我总是担心数据层给我返回的对象实例为null。

  所以,每次使用数据层返回的对象实例我都要判断下是否为null

  UserRepository respository = new UserRepository();
  var user = respository.GetById("008");
  if (user!=null)
  {
      user.SayHello();
  }

   虽然这样是避免了因为空值引发异常的问题,但是这样增加了客户端代码的很多工作量,而且一旦某个地方忘记判断,我的代码就会出现空异常;为了解决这个问题,我们引入了空对象模式,将空对象扼杀在数据的源头

    public interface IUser
    {
        void SayHello();
    }
    public class User : IUser
    {
        public string Id { get; private set; }

        public User(string id)
        {
            Id = id;
        }

        public void SayHello()
        {
            Console.WriteLine("{0}:Hello", Id);
        }
    }
    public class NullUser : IUser
    {
        public void SayHello()
        {
            //对于空对象实例来说,它的任何方法都应该不用做任何处理
        }
    }
    public class UserRepository
    {
        private ICollection<User> users;

        public UserRepository()
        {
            users = new List<User>() {
                new User("001"),
                new User("002"),
                new User("003"),
                new User("004"),
                new User("005")
            };
        }

        public IUser GetById(string userId)
        {
            IUser user = users.SingleOrDefault(s => s.Id == userId);
            if (user == null)//检查User的实例是否为null,如果是返回一个特殊的Iuser
            {
                user = new NullUser();
            }
            return user;
        }
    }

  在上面的代码中,我们在数据层中直接就判断了user实例是不是为null,如果为null,就返回一个用作null值处理的对象实例

 static void Main(string[] args)
 {
     UserRepository respository = new UserRepository();
     var user = respository.GetById("008");
     user.SayHello();
     user = respository.GetById("003");
     user.SayHello();
     Console.ReadLine();
 }

  现在妈妈再也不用担心我调用数据层的对象实例报空引用了,当然这种方式并不仅限于在数据层使用

posted @ 2016-07-22 19:43  高效养猪倌  阅读(619)  评论(1编辑  收藏  举报