zoukankan      html  css  js  c++  java
  • 使用Null Object设计模式[转]

    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通信框架的设计、实现与应用》

  • 相关阅读:
    分布式文件系统
    分布式系统中的CAP理论
    安装Elasticsearch-header插件
    Elasticsearch 安装
    分布式搜索引擎-ES
    高可用集群架构 Keepalived 双机主备和双主热备
    先阶段部署架构
    技术人员的两个发展方向
    input标签写CSS时需要注意的几点(先收藏)
    如何设置box shadow的透明度
  • 原文地址:https://www.cnblogs.com/RuiLei/p/660296.html
Copyright © 2011-2022 走看看