知道这个模式还是通过《重构》,这个模式的出现还是了为了解决代码重复的坏味道。在项目中很经常见到类似下面这样的代码:
java 代码
- if(prj.getProjectId==null)
- plan.setCost(0.0);
- else
- plan.setCost(prj.getCost());
我们在很多地方有类似的检查对象是否为null,如果为null,需要一个默认值等等这样的场景。显然,代码重复是坏味道,怎么消除这个坏味道呢?答案就是使用NullObject替代之,Null Object继承原对象。
java 代码
- class NullProject extends Project{
- public boolean isNull(){
- return true;
- }
- }
- class Project{
- private double cost;
- private String projectId;
- .
- public boolean isNull(){
- return false;
- }
- }
那么,原来的代码可以改写为:
java 代码
- if(prj.isNull())
- plan.setCost(0.0);
- else
- plan.setCost(prj.getCost());
如果Null Object的引入仅仅是带来这个好处,似乎没有理由让我们多敲这么多键盘。问题的关键是类似上面这样的判断也许出现在很多处,那么有价值的技巧出现了,我们在NullObject覆写getCost,提供缺省值:
java 代码
- class NullProject extends Project{
- public boolean isNull(){
- return true;
- }
- public double getCost(){
- return 0.0;
- }
- }
因此,检查对象是否为null的代码可以去掉if...else了:
java 代码
- plan.setCost(prj.getCost());
请注意,只有那些大多数客户端代码都要求null object做出相同响应时,这样的行为才有意义。比如我们这里当工程id为null,很多地方要求费用就默认为0.0。 特殊的行为我们仍然使用isNull进行判断。
当然,另外在需要返回NullObject的地方,你应该创建一个null object以替代一般的对象,我们可以建立一个工厂方法:
java 代码
- class Project{
- private double cost;
- private String projectId;
- .
- public boolean isNull(){
- return false;
- }
- public Project createNullProject(){
- return new NullProject();
- }
- }
Null Object模式带来的好处:减少了检查对象是否为null的代码重复,提高了代码的可读性,通常这些Null Object也可以为单元测试带来简便。
分享到:
相关推荐
private static object syncRoot = new object(); private Singleton() {} public static Singleton Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) { instance...
主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...
private static object syncRoot = new object(); private Singleton() {} public static Singleton Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) { ...
private static object syncRoot = new object(); private Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) { ...
职责链模式(Chain of Responsibility)是一种行为型设计模式,它允许你将请求沿着处理者对象的链进行传递,直到某个对象处理该请求。在C#编程中,职责链模式能够帮助我们实现一种松耦合的架构,使得请求的发送者和...
面向对象设计模式是软件开发中的重要工具,它们是经过时间考验的最佳实践,为解决特定问题提供了模板。在C#编程中,设计模式的应用能够提升代码的可读性、可维护性和可扩展性。本篇文章将深入探讨“Singleton”...
面向对象设计模式是软件开发中的重要工具,它们提供了一种标准化的方法来解决常见的设计问题,使得代码更加可读、可维护。在C#编程中,设计模式的应用尤为广泛,其中"Singleton"(单例)模式是一种创建型设计模式,...
《C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)》这个视频教程很可能深入浅出地介绍了单例模式的概念、实现方式以及在实际项目中的应用案例,对于学习和掌握单例模式是很好的参考资料。通过观看和实践...
C#单例模式的实现和性能对比 单例模式是软件工程中使用最多的几种模式之一,它是一种只能存在一个实例的类,在C#中,更准确的说法是在每个AppDomain之中只能存在一个实例的类。单例模式的实现方式有很多种,本文将...
在JavaScript中,使用typeof运算符对null进行检查时,会返回"object"。这一点经常让人感到困惑,因为实际上null并不是一个对象,这个返回值是JavaScript早期版本中一个设计上的错误。尽管存在这样的错误,null通常被...
在上述示例中,`SELECT * FROM sys.dm_db_index_physical_stats (DB_ID('DMVTest'), OBJECT_ID('DMVTest..t1'), NULL, NULL, 'DETAILED')` 就能在80兼容模式的DMVTest数据库中成功执行。 总结来说,SQL Server的...
当试图访问对象的一个属性时,如果该对象上没有找到,就会去其`__proto__`(或`[[Prototype]]`)链上查找,直到找到该属性或者到达`null`(原型链的终点)。 接着是借用构造函数,也称为“经典继承”。这种模式下,...
- **简介**:JavaScript Object Notation,一种轻量级的数据交换格式。 - **用途**:用于服务器与客户端之间传递数据。 #### 三、其他知识点 **1. HTTP协议** - **基本概念**:超文本传输协议,定义了客户端与...
通过以上介绍,我们可以看到《ppk谈JavaScript》这本书为初学者提供了一个很好的起点,不仅涵盖了语言的基础知识,还涉及了一些高级主题。对于想要深入学习JavaScript的人来说,这本书是一个宝贵的学习资源。
// 弹出的是 object,此时的 this 表示 object ``` 在这个例子中,`o.foo()`的调用使得`this`指代`o`对象。 3. **构造器形态**: 构造器是通过`new`关键字来创建新对象的函数。在构造器内部,`this`指向新创建的...
Introduce Null Object 引入Null对象 Introduce Assertion 引入断言 Chapter 10:Making Method Calls Simpler 简化方法调用 Rename Method 重命名方法 Add Parameter 添加参数 Remove ...
3. 函数作为单独的表达式调用,如`foo()`,`this`在严格模式下是undefined,在非严格模式下是全局对象(ES5)或undefined(ES6+)。 4. 使用`.call()`、`.apply()`或`.bind()`方法,可以显式设置`this`的值。 理解...