`
djsl6071
  • 浏览: 576843 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

谈NullObject模式

阅读更多

 谈NullObject模式

转自:http://www.blogjava.net/killme2008/archive/2007/07/31/133628.html 

    知道这个模式还是通过《重构》,这个模式的出现还是了为了解决代码重复的坏味道。在项目中很经常见到类似下面这样的代码:
<!---->if(prj.getProjectId==null)
    plan.setCost(
0.0);
else
    plan.setCost(prj.getCost());

   我们在很多地方有类似的检查对象是否为null,如果为null,需要一个默认值等等这样的场景。显然,代码重复是坏味道,怎么消除这个坏味道呢?答案就是使用NullObject替代之,Null Object继承原对象。
<!---->class NullProject extends Project{
   
public boolean isNull(){
      
return true;
   }
}
class Project{
   
private double cost;
   
private String projectId;
   .
   
public boolean isNull(){
        
return false;
   }
}

那么,原来的代码可以改写为:
<!---->if(prj.isNull())
    plan.setCost(
0.0);
else
    plan.setCost(prj.getCost());

    如果Null Object的引入仅仅是带来这个好处,似乎没有理由让我们多敲这么多键盘。问题的关键是类似上面这样的判断也许出现在很多处,那么有价值的技巧出现了,我们在NullObject覆写getCost,提供缺省值:
<!---->class NullProject extends Project{
   
public boolean isNull(){
      
return true;
   }
   
public double getCost(){
      
return 0.0;      
   }
}
    因此,检查对象是否为null的代码可以去掉if...else了:
<!---->plan.setCost(prj.getCost());

    请注意,只有那些大多数客户端代码都要求null object做出相同响应时,这样的行为才有意义。比如我们这里当工程id为null,很多地方要求费用就默认为0.0。特殊的行为我们仍然使用isNull进行判断。
    当然,另外在需要返回NullObject的地方,你应该创建一个null object以替代一般的对象,我们可以建立一个工厂方法:

<!---->class Project{
   
private double cost;
   
private String projectId;
   .
   
public boolean isNull(){
        
return false;
   }
   
public Project createNullProject(){
        
return new NullProject();
   }
}

   Null Object模式带来的好处:减少了检查对象是否为null的代码重复,提高了代码的可读性,通常这些Null Object也可以为单元测试带来简便。
转者评:null,就是引用为空,就是无引用的对象,这种情况在抽象空间中不是没有,但在实际项目中处理的,往往不是所谓真正的虚空,而是代表一种特例,它无所谓是1还是0,只要它能标识一种与众不同的状态就可以了,然而语言级别在null上的表现与普通对象的处理过于区分,不利于写出直截了当的代码,所以,建议少用null,而用一种特殊的状态标识来处理它,那可以是nullObject,或者somethingelseOjbect,whatever,只要它可以标识,就行了。
分享到:
评论

相关推荐

    C#对象为Null模式(Null Object Pattern)实例教程

    主要介绍了C#对象为Null模式(Null Object Pattern),以一个简单实例深入分析了C#为Null情况下的处理方法,需要的朋友可以参考下

    NullObject模式研究 (2013年)

    在许多面向对象的程序设计...NullObject模式能够用来解决这一问题。本文阐述了NullObject模式及其实现方式,针对空目标的单一实例化策略,给出了改进措施。NullObject模式对去除重复检测和减少空引用异常有较明显的效果。

    10个PB常见问题的讨论

    10个PB常见问题的讨论

    SafeFinder:当NullObject遇到ActiveRecord时

    使用SafeFinder,您可以通过简单的DSL定义模型的Null Object ,并在找不到该模型的实例时将其返回。 安装 将此行添加到您的应用程序的Gemfile : gem 'safe_finder' 然后执行: $ bundle 或将其自己安装为: $ ...

    用Java实现23种设计模式

    空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate ...

    23种java版设计模式源码案例.zip

    23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) ...空对象模式(null object) 策略模式(strategy) 模板模式(template) 访问者模式(visitor)

    敏捷软件开发:原则、模式与实践

    第17章 NULL OBJECT模式 第18章 薪水支付案例研究:第一次迭代开始 第19章 薪水支付案例研究:实现 第四部分 打包薪水支付系统 第20章 包的设计原则 第21章 FACTORY模式 第22章 薪水支付案例研究(第2部分) 第五...

    33种JAVA设计模式DEMO

    空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 ...

    敏捷软件开发原则、模式与实践 C#版

    第21章 COMMAND模式和ACTIVE OBJECT模式:多功能与多任务 第22章 TEMPLATE METHOD模式和STRATEGY模式:继承和委托 第23章 FACADE模式和MEDIATOR模式 第24章 SINGLETON模式和MONOSTATE模式 第25章 NULL OBJECT模式 ...

    敏捷软件开发:原则、模式与实践.pdf

    第十七章 NULL OBJECT模式 第十八章 薪水支付案例研究:第一次迭代开始 第十九章 薪水支付案例研究:实现 第Ⅳ部分 打包薪水支付系统 第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究...

    机器学习数据分析方法.pdf

    null object imdb_id 3000 non-null object original_language 3000 non-null object original_title 3000 non-null object overview 2992 non-null object popularity 3000 non-null float64 poster_path 2999 non-...

    空对象模式

    在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式...

    敏捷软件开发:原则、模式与实践.pdf 高清

    第十七章 NULL OBJECT模式 第十八章 薪水支付案例研究:第一次迭代开始 第十九章 薪水支付案例研究:实现 第Ⅳ部分 打包薪水支付系统 第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究...

    敏捷软件开发:原则、模式与实践.pdf

    第17章 NULL OBJECT模式 第18章 薪水支付案例研究:第一次迭代开始 第19章 薪水支付案例研究:实现 第四部分 打包薪水支付系统 第20章 包的设计原则 第21章 FACTORY模式 第22章 薪水支付案例研究(第2部分) 第...

    Python库 | null-object-0.1.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:null-object-0.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Teigha帮助文档

    Teigha曾用名OpenDWG 、DWGdirect,Teigha支持dwg、dgn、stl、pdf之间的数据交换。Teigha支持的多个平台:Windows、Mac、Unix、Linux等。 ODA 会员可以用 C++, .NET, 和 ActiveX 接口开发自己的应用程序。...

Global site tag (gtag.js) - Google Analytics