前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >空对象模式(Null Object Pattern)

空对象模式(Null Object Pattern)

作者头像
Tom弹架构
发布2021-12-21 14:18:34
1.1K0
发布2021-12-21 14:18:34
举报
文章被收录于专栏:Tom弹架构

本文节选自《设计模式就该这样学》

1 空对象模式的定义

空对象模式(Null Object Pattern)不属于GoF设计模式,但是它作为一种经常出现的模式足以被视为设计模式了。其具体定义为设计一个空对象取代NULL对象实例的检查。NULL对象不是检查控制,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为,属于行为型设计模式。

原文:Provide an object as a surrogate for the lack of an object of a given type. The Null object provides intelligent do nothing behavior, hiding the details from its collaborators.

2 空对象模式的应用场景

空对象模式适用于以下应用场景。

(1)对象实例需要一个协作实例。空对象模式不会引入协作实例,它只是使用现有的协作实例。

(2)部分协作实例不需要做任何处理。

(3)从客户端中将对象实例不存在的代码逻辑抽象出来。

3 空对象模式的UML类图

空对象模式的UML类图如下图所示。

由上图可以看到,空对象模式主要包含3个角色。

(1)抽象对象(AbstractObject):定义所有子类公有的行为和属性。

(2)真实对象(RealObject):继承AbstractObject类,并实现所有行为。

(3)空对象(NullObject):继承AbstractObject类,对父类方法和属性不做实现和赋值。

4 空对象模式的通用写法

以下是空对象模式的通用写法。

代码语言:javascript
复制

public class Client {

    public static void main(String[] args) {
        ObjectFactory factory = new ObjectFactory();
        System.out.println(factory.getObject("Joe").isNill());
        System.out.println(factory.getObject("Tom").isNill());
    }


    //抽象对象
    static abstract class AbstractObject{
        abstract void request();
        abstract boolean isNill();
    }

    //空对象
    static class NullObject extends AbstractObject{

        public void request() {
            System.out.println("Not Available Request");
        }

        boolean isNill() {
            return true;
        }
    }

    //真实对象
    static class RealObject extends AbstractObject{
        private String name;
        public RealObject(String name) {
            this.name = name;
        }

        public void request() {
            System.out.println("Do samething...");
        }

        boolean isNill() {
            return false;
        }
    }

    //对象工厂
    static class ObjectFactory{
        private static final String[] names = {"Tom","Mic","James"};

        public AbstractObject getObject(String name){
            for (String n : names) {
                if(n.equalsIgnoreCase(name)){
                    return new RealObject(name);
                }
            }
            return new NullObject();
        }
    }
}

5 空对象模式的优点

(1)它可以加强系统的稳固性,能有效地减少空指针报错对整个系统的影响,使系统更加稳定。

(2)它能够实现对空对象情况的定制化的控制,掌握处理空对象的主动权。

(3)它并不依靠Client来保证整个系统的稳定运行。

(4)它通过定义isNull()对使用条件语句==null的替换,显得更加优雅,更加易懂。

6 空对象模式的缺点

每一个要返回的真实的实体都要建立一个对应的空对象模型,那样会增加类的数量。

本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom弹架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 空对象模式的定义
  • 2 空对象模式的应用场景
  • 3 空对象模式的UML类图
  • 4 空对象模式的通用写法
  • 5 空对象模式的优点
  • 6 空对象模式的缺点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档