文章出處

索引

意圖

通過對缺失對象的封裝,以提供默認無任何行為的對象替代品。

Encapsulate the absence of an object by providing a substitutable alternative that offers suitable default do nothing behavior.

In short, a design where "nothing will come of nothing".

結構

參與者

AbstractObject

  • 聲明協作對象的接口。
  • 如果需要,可以實現默認行為。

RealObject

  • 具體的協作對象類,提供有意義的行為。

NullObject

  • 空對象類,繼承自 AbstractObject,但接口實現不做任何事情。

Client

  • 請求協作對象。

適用性

當以下情況成立時可以使用 Null Object 模式:

  • 一個對象需要一個協作對象,但并無具體的協作對象。
  • 協作對象不需要做任何事情。

效果

  • 減少了對對象是否為 Null 的判斷。
  • 提供默認無任何具體行為的協作對象。

相關模式

  • 因為 Null Object 通常沒有任何狀態,所以多個實例可能都是類似的,可以使用 Singleton 模式來實現。
  • Null Object 看起來很像 Proxy 模式,但兩者有著不同的目的。Proxy 提供對目標對象訪問的控制,而 Null Object 并不隱藏任何對象。
  • Null Object 可以作為 Strategy 模式中的一個特例。Strategy 提供多個具體類以區分算法,而 NullStrategy 則可不做任何事情。
  • Null Object 可以作為 State 模式中的一個特例。使用 NullState 以便不做任何事情。
  • Visitor 模式中也可以使用 Null Object 以提供某種默認行為。

實現

實現方式(一):Null Object 的示例實現。

 1 namespace NullObjectPattern.Implementation1
 2 {
 3   public interface ILog
 4   {
 5     void Write(string message);
 6   }
 7 
 8   public class ConsoleLog : ILog
 9   {
10     public void Write(string message)
11     {
12       Console.WriteLine(message);
13     }
14   }
15 
16   public class NullLog : ILog
17   {
18     public void Write(string message)
19     {
20       // do nothing
21     }
22   }
23 
24   public class Client
25   {
26     public void TestCase1()
27     {
28       ILog log1 = new ConsoleLog();
29       ILog log2 = new NullLog();
30 
31       log1.Write("message to log");
32       log2.Write("message to log");
33     }
34   }
35 }

設計模式之美》為 Dennis Gao 發布于博客園的系列文章,任何未經作者本人同意的人為或爬蟲轉載均為耍流氓。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()