`

Null Object 模式

 
阅读更多
    Null Object 模式用在下面两个场景里确实有作用:
1。一种是返回集合的时候。如果返回集合时返回null,我们就必须多做一步判断:
List<Person> persons = personCache.fetchAll();
if(persons!=null){
    for(Person p:persons){
        p.doSometing();
    }
}
但如果返回的是一个空集合,我们就不需要判断是否为null了。
2。另一个场景是在策略模式(Strategy Pattern)或者状态模式(
State Pattern)中。这两种模式下,都是要根据一定的策略或者状态进行不同的操作,这种情况下设置一个默认的do nothing的Null Object很有用。
我们还是用Person的例子。比方每个Person都有个绝技,我们叫KillSkill。

public interface KillSkill{
    public void kill(Person p);
}
//降龙十八掌
public XiangLong implements KillSkill{
    public void kill(Person p){
        // 丐帮帮主之绝学,阳刚无匹,血减50。
         p.blood = p.blood - 50;
    }
}
//独孤九剑
public DuGu implements KillSkill{
    public void kill(Person p){
        //剑魔独孤求败的绝学,风清扬传令狐冲 ,血减30。
        p.blood = p.blood - 30;
    }
}
//Null Object
public  NullSkill implements KillSkill{
    public void kill(Person p){
        //do nothing
    }
}

public class Person {
    public int blood;
    public KillSkill killSkill;
    public Person(int blood,KillSkill killSkill){
        this.blood = blood;
        this.killSkill = killSkill;
    }
}

public class PersonCache {

    public static Person[] callHeros() {
        //萧峰出场
        Person qiaofeng = new Person(100, new XiangLong());
        //令狐冲出场
        Person linghuchong = new Person(100, new DuGu());
        //该我出场了,我这样的平凡人没啥特殊的必杀技,就是伪装个侠客,混饭吃。
        Person me = new Person(100, null);
        return new Person[]{qiaofeng, linghuchong, me};
    }
}

Person boss = PersonCache.callBoss();
 
//现在有人遇到危难了,boss出场了,要雇佣几个侠客给自己报仇。

Person heros = PersonCache.callHeros();
//英雄们轮番上阵
for(Person p:heros){
    p.killSkill.kill(boss);
}
//结果出错了。这里面有个假侠客,me,killSkill是null.漏馅了,看来这行混不下去了。有没有别的办法?Null Object模式。
Person me = new Person(100,new NullSkill());
//我学了一招do nothing的招数,这下没有NullPointer错误了,不容易被识破了。
分享到:
评论

相关推荐

    NullObject模式研究 (2013年)

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

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

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

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

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

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

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

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

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

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

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

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

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

    敏捷软件开发.pdf

    第17章 NULL OBJECT模式 17.1 结论 参考文献 第18章 薪水支付案例研究:第一次迭代开始 18.1 介绍 18.2 基于用例分析 18.3 反思:我们学到了什么 18.4 找出潜在的抽象 18.5 结论 参考文献 第19章 薪水...

    用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)

    33种JAVA设计模式DEMO

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

    举例讲解Python中的Null模式与桥接模式编程

    Null模式 我想每个人都有一种经历,为了获取某属性,但是有时候属性是None,那么需要你做异常处理, 而假如你想节省这样的条件过滤的代码,可以使用Null模式以减少对象是否为None的判断 python的例子 我举个不是很...

    空对象模式

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

    使用并行扩展附加功能中的管道

    Pipeline和NullObject模式的组合使用大大简化了数据处理

    python学习小技巧:举例讲解Python中的Null模式与桥接模式编程

    这篇文章主要介绍了Python中的Null模式与桥接模式编程,Null模式与桥接模式都属于Python的设计模式编程,需要的朋友可以参考下 Null模式 我想每个人都有一种经历,为了获取某属性,但是有时候属性是None,那么需要你做...

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码)

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...

Global site tag (gtag.js) - Google Analytics