在ESFramework的设计实现中,很多地方都用到了Null Object设计模式。Null Object模式的含义在于,提供一个对象给指定的类型,用以代替这个对象为空的情况。 Null Object提供了“什么也不做”的行为,隐藏来自它的合作者的细节。
   对于如何理解和应用该模式,通过一个实例就能很好的进行说明。这一节我们在讨论消息分派器,消息分派器使用了前述的日志记录器,并且通过属性来注入具体的日志记录器对象。

        private IEsfLogger esfLogger;
        public IEsfLogger EsfLogger
        {
            set
            {
                this.esfLogger = value;
            }
        }    

现在假设,我们在消息分派器内部的多个地方使用日志记录器来进行日志记录,我们总要写这样的语句:

     if (this.esfLogger != null)
     {
          this.esfLogger.Log(); //记录日志
     }

也就是说,在使用之前,我们都要判断一下日志记录器的引用是否为空,如果不为空才可以调用其Log方法。如果调用日志记录器进行日志记录的地方很多,那么每个地方都会充斥着这种判断其引用是否为空的代码。有没有办法来避免这所有的判断语句了,有!那就是使用Null Object设计模式。
    ESFramework为每种必要的组件都提供了对应的Null Object类型,这些类型的名字以“Empty”作为前缀。比如IEsfLogger对应的Null Object类型就是EmptyEsfLogger,EmptyEsfLogger实现的Log方法什么也不用做:

        public void Log(string errorType ,string msg, string location, ErrorLevel level)
        {
            //Do Nothing !
        }

有了EmptyEsfLogger,我们就可以象这样来设计消息分派器的日志记录器属性:

        private IEsfLogger esfLogger = new EmptyEsfLogger();
        public IEsfLogger EsfLogger
        {
            set
            {
                if (value != null)
                {
                    this.esfLogger = value ?? new EmptyEsfLogger();
                }
            }
        }

首先,将esfLogger字段的默认值设为一个Null Object。其次,当调用者每次试图将EsfLogger属性设置为null时,也将一个Null Object赋值给该字段。
   如此一来,在消息分配器内部,我们就可以非常方便的直接使用日志记录器,而不用再判断其引用是否为空,因为无论如何,它总是指向一个有效的对象,即使这个对象是Null Object。

除了常见的组件装配可以使用Null Object模式外,还有一个非常适合使用Null Object模式的场合,那就是“事件”。你是否还记得,我们每次触发事件时都需要判断其是否为空,这也是非常琐碎的事情,我们仍然可以通过Null Object模式来简化它。比如某个类中定义了一个事件:

public event CbSimple SomeOneConnected;

在类的构造函数中,可以使用Null Object来初始化它:

this.SomeOneConnected += delegate { };

这样,在每次触发事件时就不用再判断其是否为null了:

this.SomeOneConnected(); //不用再判断是否为null,直接触发事件

灵活地使用Null Object设计模式,可以使得我们的代码更加简洁和精炼。

注:本文节选自我的书稿 《.NET通信框架的设计、实现与应用》

转载于:https://www.cnblogs.com/RuiLei/archive/2007/02/28/660296.html

使用Null Object设计模式[转]相关推荐

  1. 被遗忘的设计模式——空对象模式(Null Object Pattern)

    一.Pattern name Provide an object as a surrogate for the lack of an object of a given type. The Null ...

  2. on a null object reference 问题的解决办法

    on a null object reference 问题的解决办法 参考文章: (1)on a null object reference 问题的解决办法 (2)https://www.cnblog ...

  3. 18、Page Object 设计模式

    Page Object 设计模式的优点如下: 减少代码的重复. 提高测试用例的可读性. 提高测试用例的可维护性, 特别是针对 UI 频繁变化的项目. 当你针对网页编写测试时,你需要引用该网页中的元素, ...

  4. android.content.Context.getResources()‘ on a null object reference

    super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); //开始运行时就把库先建好 //我在这边一开始 ...

  5. Introduce Null Object(引入Null对象)

    Introduce Null Object(引入Null对象) 你需要再三检查某对象是否为null. 将null值替换为null对象. if (customer == null) plan = Bil ...

  6. ide循环执行用例 selenium_Selenium Web自动化Page Object设计模式——循环执行测试用例...

    继续优化上一篇博客的设计 Selenium Web自动化Page Object设计模式--driver初始化 https://www.cnblogs.com/Ravenna/p/14172411.ht ...

  7. Introduce Null Object

    今天继续总结<重构>这本书中的一个重构手法,Introduce Null Object.写这个手法是因为它确实很巧妙,在实际编程中经常会遇到这种情况,前人总结出来了这么一个经典的手法,当然 ...

  8. setContentView报错NullPointerException: Attempt to invoke virtual method on a null object reference

    setContentView报错: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lan ...

  9. 解决Attempt to invoke virtual method '...ListAdapter'on a null object reference

    解决:Attempt to invoke virtual method 'voidAndroid.widget.GridView.setAdapter(android.widget.ListAdapt ...

最新文章

  1. 2021年大数据Flink(十):流处理相关概念
  2. Discuz!NT论坛代码小分析
  3. Delphi下的GDI+编程[2] DrawLine - 绘制直线
  4. 数字化时代,CIO该如何理解数字能力
  5. KEIL常见编译错误和警告解决方案汇总
  6. 下一个游戏新风口已来?小游戏或成2018年最大游戏黑马
  7. 数据仓库事实表分类[转]
  8. 工信部副部长怀进鹏:信息产业呈现四大发展特点
  9. GnuPG 的PGP使用
  10. 和显卡驱动要配套吗_显卡有必要更新驱动程序吗?老玩家的建议请收好
  11. 江苏省计算机二级用英语,江苏省计算机二级考试(VB)最新大纲及要求(国外英语资料).doc...
  12. apulSoft apUnmask for mac(音频放大组件)
  13. 并行接口芯片8255与定时器/计数器接口芯片8253
  14. 人口logistic模型公式_最新人口指数增长模型和logistic模型教学文案
  15. linux 中的top命令的介绍
  16. Multi-University Training Contest 4
  17. 计算机毕业设计 基于JavaWbe的校友录管理系统(源码+论文)
  18. 【联邦学习邂逅密码学系列】基于同态加密算法python代码实现
  19. 【题单——基础字符串】菜鸡L_C_A的基础字符串(KMPACAM)
  20. 正冠桩基础系列软件之桩施工情况竣工图视频教程

热门文章

  1. 背英语单词很困难,不妨学习一下词根词缀吧(每天10个词根、词缀)Part 3
  2. 图论--Floyd总结
  3. ElasticSearch入门 —— 集群搭建
  4. Spatial Transformer Networks(STN)详解
  5. uCOS-II中的OS_CPU.h,OS_CPU_A.s,OS_CPU.c
  6. Linux维护笔记四
  7. 使用python logging的配置
  8. Tensorflow(一) 基础命令
  9. linux kernel 三次握手建立TCP链接的实现
  10. 嵌入式软件开发必看书籍推荐(C/C++、linux、软件开发)