zoukankan      html  css  js  c++  java
  • 设计模式:空对象模式(Null Object Pattern)

    设计模式:空对象模式(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是个好东西,这里有很多支持你的朋友,他们给你鼓励、意见和批评。谢谢兄弟们,加油!

  • 相关阅读:
    iOS NSUserDefaults 存储可变数组问题
    iOS之[文件下载 / 大文件下载 / 断点下载]
    macOS 新手开发:第 2 部分
    iOS 游戏素材
    iOS 动画
    macOS 开发
    iOS 之访问权限以及跳转到系统界面
    蓝桥杯—ALGO-18 单词接龙(DFS)
    蓝桥杯—ALGO-12 幂方分解(递归递推)
    蓝桥杯—ALGO-131 Beaver's Calculator
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3173032.html
Copyright © 2011-2022 走看看