zoukankan      html  css  js  c++  java
  • 设计模式外传——NULL OBJECT模式

    NULL OBJECT看着这个名字应该有一个笼统的印象了。翻译成中文就是“空对象”。
    假如我们要使用一个刚刚获得的对象的方法,首先需要检查一下该对象是否等于null,因为等于null的话调用方法会报未实例化异常,可是这样的写法很丑,如下所示:
    MM mm = Money.GetMM();
    mm.Smile();   //注意如果GetMM方法未找到MM就会返回一个null,那么mm.Smile();就会报异常了。
    为了解决这个问题我们一般是这样处理:
    MM mm = Money.GetMM();
    if(mm!=null)
    {
           mm.Smile();
    }
    这样就可以高枕无忧了,偶也~~~~~~~
    但是这样的东东是不是很丑哦。
    如果你使用了NULL OBJECT模式就没这么多烦恼了,以下是MM的NULL OBJECT实现:
        public class MM
        {
            
    public static readonly MM Empty = new NULLMM();

            
    public virtual void Smile()
            {
                Console.WriteLine(
    "我笑~~~~~");
            }

            
    private class NULLMM : MM
            {
                
    public override void Smile()
                {
                    
    //什么都不做
                } 
            }
        }
    此时我们的Money.GetMM();方法如果得到了空值不返回null而是返回MM.Empty。由于MM.Empty已经是MM对象但是重写了Smile方法(什么都不做,体现了空对象的“素质”),这样的话mm.Smile();方法不用判断mm是否为空都可以执行了。
    那在FrameWork中有这样的设计模式吗?答案是肯定的,比如:String.Empty,Decimal.Zero等。
    用String.Empty写个例子吧。假如没有NULL OBJECT模式,也就是说没有String.Empty,我们会写下以下代码:
            public static string MyToUpper(string input)
            {
                
    string strTmp = null;
                
    if (input.Length > 4)
                {
                    strTmp 
    = input.Substring(4);
                }
                
    return strTmp.ToUpper();
            }
    此时输入长度大于4的字符串是没有问题的,但是小于4的话由于strTmp未被赋值,也就是说strTmp是null,此时就会报“未将对象引用设置到对象的实例”异常。我们一般会改写为:
            public static string MyToUpper(string input)
            {
                
    string strTmp = null;
                
    if (input.Length > 4)
                {
                    strTmp 
    = input.Substring(4);
                }
                
    if (strTmp == null)
                {
                    
    return "";
                }
                
    else
                {
                    
    return strTmp.ToUpper();
                }
            }
    以上判断了字符串是否为null,假如你知道有String.Empty这个NULL OBJECT模式的东东,你一定会写下下面这段优雅的代码的:
            public static string MyToUpper(string input)
            {
                
    string strTmp = String.Empty;
                
    if (input.Length > 4)
                {
                    strTmp 
    = input.Substring(4);
                }
                
    return strTmp.ToUpper();
            }
    此处的String.Empty相当于“”。如果你自己的类需要使用NULL OBJECT方法的话,就需要参考上边的MM类了。NULL OBJECT模式使得代码更加优雅些,具体还有什么特殊的用处我还未研究,以后看吧~~~~
    敬告

    作者:pangxiaoliang
    出处:http://www.cnblogs.com/pangxiaoliang
    本文版权归pangxiaoliang和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。
  • 相关阅读:
    1.20 测试嵌套对象使用Object.defineProperty是否有效?
    1.6 对象解构赋值机制
    12.26 sessionStorage与locaStorage的区别(作用域、生命周期)
    break,continue,return 区别
    过滤关键词
    ES6 笔记
    Cesium 学习笔记
    Cesium 学习笔记
    【vue】清理代码
    《CSS世界》读书笔记(十六)
  • 原文地址:https://www.cnblogs.com/pangxiaoliang/p/1545670.html
Copyright © 2011-2022 走看看