1、空对象模式的概念
在空对象模式(Null Object Pattern)中,一个空对象取代NULL对象实例的检查。Null对象不是检查空值,而是反应一个不做任何动作的关系。这样的Null对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
2、实现
将创建一个定义操作(在这里,是客户的名称)的AbstractCustomer抽象类,和扩展了AbstractCustomer类的实体类。工厂类CustomerFactory基于客户传递的名字来返回RealCustomer或NullCustomer对象。NullPatternDemo类使用CustomerFactory来演示空对象模式的用法。如下图:
(1)抽象类
创建一个抽象类AbstractCustomer,如下:
public abstract class AbstractCustomer {
protected String name;
//抽象方法,判断为空
public abstract boolean isNull();
//抽象方法,获取name值
public abstract String getName();
}
(2)创建抽象类的子类
创建抽象类AbstractCustomer的子类:
public class RealCustomer extends AbstractCustomer{
//构造方法
public RealCustomer(String name) {
this.name = name;
}
@Override
public boolean isNull() {
return false;
}
@Override
public String getName() {
return name;
}
}
public class NullCustomer extends AbstractCustomer{
@Override
public boolean isNull() {
return true;
}
@Override
public String getName() {
return "查无此客户!";
}
}
(3)创建CustomerFactory类
/*
* 此类获取客户对象
*/
public class FactoryCustomer {
// 静态数据
public static final String[] names = {"李狗蛋", "李铁柱", "狗蛋子" };
// 获取客户对象
public static AbstractCustomer getCustomer(String name) {
for (int i = 0; i < names.length; i++) {
if (names[i].equals(name)) {
return new RealCustomer(name);
}
}
return new NullCustomer();
}
}
(4)测试
public class TestNullObj {
public static void main(String[] args) {
AbstractCustomer c0 = FactoryCustomer.getCustomer("李狗蛋");
System.out.println(c0.getName());
AbstractCustomer c2 = FactoryCustomer.getCustomer("李铁柱");
System.out.println(c2.getName());
AbstractCustomer c3 = FactoryCustomer.getCustomer("狗蛋子");
System.out.println(c3.getName());
AbstractCustomer c4 = FactoryCustomer.getCustomer("云过梦无痕");
System.out.println(c4.getName());
}
}
执行,控制台输出:
3、总结
空对象模式并不是判断对象是不是一个空值,空对象只是表示这个对象在这个系统中是不可用的,对象并不为空,只是这个对象与当前系统无任何关系。