背景
群里聊到《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是个好东西,这里有很多支持你的朋友,他们给你鼓励、意见和批评。谢谢兄弟们,加油!