背景
群里聊到《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是個好東西,這里有很多支持你的朋友,他們給你鼓勵、意見和批評。謝謝兄弟們,加油!