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

  • 相关阅读:
    Linux常用的一些基础命令
    配置Samba(CIFS)
    部署mariadb高可用
    k8s-kuberntets
    获取企业微信的corpID,sercret,access_token,部门设置列表
    Windows系统同步软件
    windows系统ms-17-010 漏洞补丁微软下载地址
    Linux下使用Docker教程
    sqlserver必须安装的组件
    windows系统安全加固方案
  • 原文地址:https://www.cnblogs.com/happyframework/p/3172560.html
Copyright © 2011-2022 走看看