定义:当你在处理可能会出现null的对象时,可能要产生相对乏味的代码来做相应的处理,使用空对象模式可以接受null,并返回相应的信息。空对象模式通常会作为一个单独的空对象类,封装一个默认的行为。通过判断条件来返回不同的对象,空则返回空对象NullCustomer,非空返回RealCustomer,这样避免在客户端调用(XXX == null)这种判空操作。
结构图:
优点:这个模式可以消除重复。想象一下,假如有多个消费端,每个消费端都要判断一下是否为空,而且对于为空的场景要做特殊的处理,这样就会导致很多重复。一些例子是:日志对象和缓存对象、图书馆查书系统、查询系统。方便做测试,这些Null Object类似Stub Object。
使用:以下案例通过工厂类 CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象。判断条件为CustomerFactory 是否存在客户的名字。
1.创建一个对象抽象类:
public abstract class AbstractCustomer { protected String name; public abstract boolean isNull(); public abstract String getName(); }
2.创建对象的实体类,非空和空对象类:
public class RealCustomer extends AbstractCustomer { public RealCustomer(String name) { this.name = name; } public Override String getName() { return name; } public Override boolean isNull() { return false; } } public class NullCustomer extends AbstractCustomer { public Override String getName() { return "Not Available in Customer Database"; } public Override boolean isNull() { return true; } }
3.创建 CustomerFactory 类:判断是生成空对象还是非空对象的类
public class CustomerFactory { public static final String[] names = {"Rob", "Joe", "Julie"}; public static AbstractCustomer getCustomer(String name) { for (int i = 0; i < names.length; i++) { if (names[i].equalsIgnoreCase(name)) { return new RealCustomer(name); } } return new NullCustomer(); } }
4.使用 CustomerFactory,基于客户传递的名字,来获取 RealCustomer 或 NullCustomer 对象。
public class NullPatternDemo { public static void main(String[] args)
{ AbstractCustomer customer1 = CustomerFactory.getCustomer("Rob"); AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob"); AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie"); AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura"); System.out.println("Customers"); System.out.println(customer1.getName()); System.out.println(customer2.getName()); System.out.println(customer3.getName()); System.out.println(customer4.getName()); } }