1. 程式人生 > >設計模式系列 - 空物件模式

設計模式系列 - 空物件模式

空物件模式取代簡單的 NULL 值判斷,將空值檢查作為一種不做任何事情的行為。

介紹

在空物件模式中,我們建立一個指定各種要執行的操作的抽象類和擴充套件該類的實體類,還建立一個未對該類做任何實現的空物件類,該空物件類將無縫地使用在需要檢查空值的地方。

類圖描述

程式碼實現

1、定義抽象類

    public abstract class AbstractCustomer
    {
        protected string Name;
        public abstract bool IsNil();
        public abstract string GetName();
    }

2、定義實體類

public class NullCustomer : AbstractCustomer
{
    public override string GetName()
    {
        return "Not Available in Customer Database";
    }

    public override bool IsNil()
    {
        return true;
    }
}

public class RealCustomer : AbstractCustomer
{
    public RealCustomer(string name)
    {
        Name = name;
    }
    public override string GetName()
    {
        return this.Name;
    }

    public override bool IsNil()
    {
        return false;
    }
}

3、定義工廠類

public class CustomerFactory
{
    public static readonly string[] names = { "Rob", "Joe", "Julie" };

    public static AbstractCustomer GetCustomer(string name)
    {
        for (int i = 0; i < names.Length; i++)
        {
            if (names[i] == name)
                return new RealCustomer(names[i]);
        }
        return new NullCustomer();
    }
}

4、上層呼叫

class Program
{
    static void Main(string[] args)
    {
        AbstractCustomer customer1 = CustomerFactory.GetCustomer("Rob");
        AbstractCustomer customer2 = CustomerFactory.GetCustomer("Bob");
        AbstractCustomer customer3 = CustomerFactory.GetCustomer("Julie");
        AbstractCustomer customer4 = CustomerFactory.GetCustomer("Laura");
        Console.WriteLine("Customers");
        Console.WriteLine(customer1.GetName());
        Console.WriteLine(customer2.GetName());
        Console.WriteLine(customer3.GetName());
        Console.WriteLine(customer4.GetName());

        Console.ReadKey();
    }
}

總結