二十二、空对象模式
空对象模式(null object pattern),并不是构建一个null对象,而是构建一个用于响应无数据或者默认处理的对象。
实现
创建一个操作抽象类AbstractCustomer
和它的一个具体实现类,以及一个继承类,但是不做任何数据处理,或者只做默认处理的类。
创建一个CustomerFactory
工厂类,用于提供具体类对象,或者NULL类对象。
- 创建抽象类
AbstractCustomer.java
/**
* Created by lenovo on 2016/12/9 0009.
* 操作抽象类,包含了一些操作方式。
*/
public abstract class AbstractCustomer {
protected String name;
public abstract boolean isNil();
public abstract String getName();
}
- 创建继承类
RealCustomer.java
/**
* Created by lenovo on 2016/12/9 0009.
* 具体实现操作的真是对象类
*/
public class RealCustomer extends AbstractCustomer {
public RealCustomer(String name) {
this.name = name;
}
@Override
public boolean isNil() {
return false;
}
@Override
public String getName() {
return name;
}
}
NullCustomer.java
/**
* 空的对象类,继承抽象类,而不做任何具体操作。
* Created by lenovo on 2016/12/9 0009.
*/
public class NullCustomer extends AbstractCustomer{
@Override
public boolean isNil() {
return true;
}
@Override
public String getName() {
return "Not Available in Customer Database";
}
}
- 创建工厂类
CustomerFactory.java
/**
* Created by lenovo on 2016/12/9 0009.
* Customer的工厂类
*/
public class CustomerFactory {
public static final String[] names = {"Joe","John","Robert"};
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();
}
}
- 演示
/**
* Created by lenovo on 2016/12/9 0009.
* 通过工厂类来调用不同的customer对象,演示空对象操作。
*/
public class NullPatternDemo {
public static void main(String[] args){
AbstractCustomer customer1 = CustomerFactory.getCustomer("robert");
AbstractCustomer customer2 = CustomerFactory.getCustomer("john");
AbstractCustomer customer3 = CustomerFactory.getCustomer("joe");
//因为没有这个人名的数据存在,所以创建的对象是NUllcustomer对象,而不是null
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());
}
}
- 输出
Customers:
robert
john
joe
Not Available in Customer Database