1. 程式人生 > >C# 設計模式之空對象模式

C# 設計模式之空對象模式

set *** 實的 中間 man blog mar 對象 同時

最近看了不少的書籍和視頻等相關資料,決定自己邊學習邊寫一下個人對設計模式的理解,如果有不對的請大家多多指正。

今天先說說我個人覺得最簡單的設計模式 -- [空對象模式]

空對象模式可以減少客戶端對對象判斷是否為空的重復操作,也可以減少異常發生的情況【如果客戶端調用程序忘記了檢查對象是否為空,而直接訪問對象中的數據,則有可能會報出異常,影響程序運行】。

廢話不說了,先上我寫的代碼,下面是未運用空對象模式之前的示例代碼:

要返回的實體代碼,Person.cs:

namespace NullObjectPattern
{
    public class Person
    {
        
/// <summary> /// 用戶ID /// </summary> public int Id { set; get; } /// <summary> /// 用戶名字 /// </summary> public string Name { set; get; } } }

中間訪問層代碼,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.Write("用戶的名字為:未知");
            else
                Console.Write("用戶的名字為:{0}", person.Name);

            Console.Read();
        }
    }
}

輸出的結果:

技術分享

按照上面的代碼來寫的話,我每次獲取用戶的詳細信息是不是都需要判斷用戶的對象是否為空?這樣會不會有重復的代碼?影響代碼質量?

我們的空對象模式就解決了這個問題。

增加一個抽象類,Human.cs:

namespace NullObjectPattern
{
    public abstract class Human
    {
        /// <summary>
        /// 用戶ID
        /// </summary>
        public int Id { set; get; }

        /// <summary>
        /// 用戶名字
        /// </summary>
        public string Name { set; get; }

    }
}

然後讓真正的實體類和空對象類同時繼承這個抽象類:

namespace NullObjectPattern
{
    public class Person: Human
    {

    }
}

空對象類:

namespace NullObjectPattern
{
    public class NullPerson : Human
    {

    }
}

中間訪問層,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
                {
                    Id = 0,
                    Name = "未知"
                };
            }
            return human;
        }

    }
}

主程序代碼:

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

            Console.WriteLine("空對象模式******************************");

            Console.Write("用戶的名字為:{0}", person.Name);
            Console.Read();
        }
    }
}

輸出的結果:

技術分享

總結:

  綜上所述,空對象模式能減少客戶端的工作量,把判斷返回對象是否為空的邏輯交給了中間層,也減少客戶端發生異常的可能性,對程序的性能進行了優化。

缺點:就是每一個要返回的真實的實體都要建立一個對應的空對象模型,那樣會增加實體層的文件數量。個人覺得這種模式在工程或者實體文件很少的情況下可以適當使用,不建議在實際工作開發中大量的使用。

謹慎使用即可。

C# 設計模式之空對象模式