关于java:空对象模式Null-Object-Pattern

31次阅读

共计 1904 个字符,预计需要花费 5 分钟才能阅读完成。

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

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 空对象模式的通用写法

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


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 弹架构』回复“设计模式”可获取残缺源码。

【举荐】Tom 弹架构:30 个设计模式实在案例(附源码),挑战年薪 60W 不是梦

本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我高兴!
如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源。关注微信公众号『Tom 弹架构』可获取更多技术干货!

正文完
 0