設計模式:空對象模式(Null Object Pattern)


背景

群里聊到《ASP.NET設計模式》,這本書里有一個“Null Object Pattern”,大家就閑聊了一下這個模式,在此記錄一下大概的結論。

典型結構

模式的結構非常簡單,這里就不多說了,類圖如下:

為什么使用這個模式?還需要null嗎?

之所以需要這個模式是因為這個模式可以消除重復。想象一下,假如有多個消費端,每個消費端都要判斷一下是否為空,而且對於為空的場景要做特殊的處理,這樣就會導致很多重復。一些例子是:日志對象和緩存對象。

這個模式帶來的另外一個好處就是方便做測試,這些Null Object類似Stub Object。

引入這個模式的前提是:“所有消費端對於空對象的行為的期望是一致的”,如果消費端A和消費端B對於“空”的處理方式不一樣,就需要兩個Null Object。對於大多數對象,他們不清楚為“空”時消費端到底需要啥行為,因此null還是需要的,而且大多數場景還是需要null

有些語言有nil對象,這種對象可以接受任何消息,這些消息不會出現異常,也沒有返回結果,對於這種語言結構,編程時需要非常注意,很可能引入BUG,並不是說這種結構不好,我是非常喜歡的。

null object可以結合嵌套私有類,見下例:

 1         /// <summary>
 2         /// 返回后續處理器。
 3         /// </summary>
 4         public static IDeserializePostProcesser GetProcesser(Type resultType)
 5         {
 6             resultType.MustNotNull("resultType");
 7 
 8             if (_Processers.ContainsKey(resultType))
 9             {
10                 return _Processers[resultType];
11             }
12 
13             return new EmptyDeserializePostProcesser();
14         }
15 
16         private class EmptyDeserializePostProcesser : IDeserializePostProcesser
17         {
18             public object OnDeserialized(object result)
19             {
20                 return result;
21             }
22         }

備注

 社區和QQ是個好東西,這里有很多支持你的朋友,他們給你鼓勵、意見和批評。謝謝兄弟們,加油!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM