zoukankan      html  css  js  c++  java
  • C# 设计模式之空对象模式

     最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正。

    今天先说说我个人觉得最简单的设计模式 -- [空对象模式]

    空对象模式可以减少客户端对对象判断是否为空的重复操作,也可以减少异常发生的情况【如果客户端调用程序忘记了检查对象是否为空,而直接访问对象中的数据,则有可能会报出异常,影响程序运行】。

    废话不说了,先上我写的代码,下面是未运用空对象模式之前的示例代码:

     

    要返回的实体代码,Person.cs:

    namespace NullObjectPattern
    {
        public class Person
        {
            /// <summary>
            /// 用户ID
            /// </summary>
            public int Id { set; get; }
    
            /// <summary>
            /// 用户名字
            /// </summary>
            public string Name { set; get; }
    
             /// <summary>
            /// 学习
            /// </summary>
            public void Study()
            {
                Console.WriteLine("{0}学习中……",Name);
            }
    
        }
    }

    中间访问层代码,PersonService.cs:

    namespace NullObjectPattern
    {
        public class PersonService
        {
            /// <summary>
            /// 获取用户信息方法
            /// </summary>
            /// <param name="id">用户id</param>
            /// <returns>用户信息对象实体</returns>
            public Person GetPersonById(int id)
            {
                Person p = null;
                if (id == 1)
                {
                    p = new Person
                    {
                        Id = 111,
                        Name = "小明"
                    };
                }
                return p;
            }
    
        }
    }

    程序主入口代码,Program.cs:

    using System;
    
    namespace NullObjectPattern
    {
        class Program
        {
            static void Main(string[] args)
            {
                var service = new PersonService();
                var person = service.GetPersonById(2);
                Console.Write("用户的名字为:{0}",person.Name);
                Console.Read();
            }
        }
    }

     

    输出的结果:

    主程序入口代码改造后,Program.cs:

    using System;
    
    namespace NullObjectPattern
    {
        class Program
        {
            static void Main(string[] args)
            {
                {
                    var service = new PersonService();
                    var person = service.GetPersonById(2);
                    if (person == null)
                        Console.WriteLine("用户的名字为:未知");
                    else
                        Console.WriteLine("用户的名字为:{0}", person.Name);
                    if (person != null)
                    {
                        person.Study();
                    }
                
                Console.Read();
            }
        }
    }

      

    输出的结果:

     

    按照上面的代码来写的话,我每次获取用户的详细信息是不是都需要判断用户的对象是否为空?这样会不会有重复的代码?影响代码质量?

    我们的空对象模式就解决了这个问题。

     增加一个抽象类,Human.cs:

        public abstract class Human
        {
            /// <summary>
            /// 用户ID
            /// </summary>
            public int Id { set; get; }
    
            /// <summary>
            /// 用户名字
            /// </summary>
            public string Name { set; get; }
    
            /// <summary>
            /// 学习
            /// </summary>
            public abstract void Study();
    
        }

    然后让真正的实体类和空对象类同时继承这个抽象类:

        public class Person: Human
        {
            /// <summary>
            /// 实现方法的默认实现
            /// </summary>
            public override void Study()
            {
                Console.WriteLine("{0}学习中……",Name);
            }
        }

    空对象类:

        public class NullPerson : Human
        {
    
            public NullPerson()
            {
                Id = 0;
                Name = "未知";
            }
    
            /// <summary>
            /// 实现方法的默认实现
            /// </summary>
            public override void Study()
            {
                Console.WriteLine("无法学习");
            }
        }

     中间访问层,PersonService.cs:

     

    namespace NullObjectPattern
    {
        public class PersonService
        {
            /// <summary>
            /// 获取用户信息方法
            /// </summary>
            /// <param name="id">用户id</param>
            /// <returns>用户信息对象实体</returns>
            public Human GetPersonById(int id)
            {
                Human human = null;
                if (id == 1)
                {
                    human = new Person
                    {
                        Id = 111,
                        Name = "小明"
                    };
                }
                else
                {
                    human = new NullPerson();
                }
                return human;
            }
        }
    }

    主程序代码:

        class Program
        {
            static void Main(string[] args)
            {
                 {
                    Console.WriteLine("空对象模式******************************");
                    var service = new PersonService();
                    var person = service.GetPersonById(2);
                    Console.WriteLine("用户的名字为:{0}", person.Name);
                    person.Study();
                }
                Console.Read();
            }
        }

    输出的结果:

     

     总结:

       综上所述,空对象模式能减少客户端的工作量,把判断返回对象是否为空的逻辑交给了中间层,也减少客户端发生异常的可能性,对程序的性能进行了优化。

    缺点:就是每一个要返回的真实的实体都要建立一个对应的空对象模型,那样会增加实体层的文件数量。个人觉得这种模式在工程或者实体文件很少的情况下可以适当使用,不建议在实际工作开发中大量的使用。

    谨慎使用即可。

  • 相关阅读:
    软件工程
    数字图像处理
    408笔记完
    408笔记完整考点篇
    解决CGLib动态代理测试不通过-Unable to load cache item
    支付宝支付与微信支付-系统化视频教程
    支付宝支付java版实战(含视频讲解)
    微信支付java版(含视频讲解)
    Java实现微信登录(网页授权)
    面试官问:实际生产中如何快速的测试接口(开发环境、测试环境、生产环境)
  • 原文地址:https://www.cnblogs.com/dawenyang/p/7214532.html
Copyright © 2011-2022 走看看