• 设计模式外传——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和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。
  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/pangxiaoliang/p/1545670.html
Copyright © 2020-2023  润新知