橘子味的心
标题:Java空对象模式

在“空对象”模式中,空对象将替换NULL对象实例的检查。而不是检查一个空值,Null对象反映一个无关的关系(即什么也不做)。 这种Null对象还可以用于在数据不可用时提供默认行为。

在空对象模式(Null Object模式)中创建一个抽象类,指定要执行的各种操作。扩展此类的具体类和一个null对象类,不提供此类的任何实现,并且无需检查空值。

实现实例

在这个实例中,将创建一个AbstractCustomer抽象类来定义一些操作。这里的客户名称和扩展AbstractCustomer类的具体类。 创建工厂类CustomerFactory用来根据传递给它的客户名称返回RealCustomerNullCustomer对象。

NullPatternDemo这是一个演示类,将使用CustomerFactory演示使用空对象模式(Null Object)模式。

空对象示例的结构如下图所示 -

第1步

创建一个抽象类,其代码如下 -
AbstractCustomer.java

  1. public abstract class AbstractCustomer {
  2. protected String name;
  3. public abstract boolean isNil();
  4. public abstract String getName();
  5. }
  6. Java

第2步

创建扩展上述类的具体类,其代码如下 -
RealCustomer.java

  1. public class RealCustomer extends AbstractCustomer {
  2.  
  3. public RealCustomer(String name) {
  4. this.name = name;
  5. }
  6.  
  7. @Override
  8. public String getName() {
  9. return name;
  10. }
  11.  
  12. @Override
  13. public boolean isNil() {
  14. return false;
  15. }
  16. }
  17. Java

NullCustomer.java

  1. public class NullCustomer extends AbstractCustomer {
  2.  
  3. @Override
  4. public String getName() {
  5. return "Not Available in Customer Database";
  6. }
  7.  
  8. @Override
  9. public boolean isNil() {
  10. return true;
  11. }
  12. }
  13. Java

第3步

创建一个CustomerFactory类,其代码如下 -
CustomerFactory.java

  1. public class CustomerFactory {
  2.  
  3. public static final String[] names = {"Rob", "Joe", "Julie"};
  4.  
  5. public static AbstractCustomer getCustomer(String name){
  6.  
  7. for (int i = 0; i < names.length; i++) {
  8. if (names[i].equalsIgnoreCase(name)){
  9. return new RealCustomer(name);
  10. }
  11. }
  12. return new NullCustomer();
  13. }
  14. }
  15. Java

第4步

使用CustomerFactory根据传递给它的客户名称获取RealCustomerNullCustomer对象。

NullPatternDemo.java

  1. public class NullPatternDemo {
  2. public static void main(String[] args) {
  3.  
  4. AbstractCustomer customer1 = CustomerFactory.getCustomer("Rob");
  5. AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob");
  6. AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie");
  7. AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura");
  8.  
  9. System.out.println("Customers");
  10. System.out.println(customer1.getName());
  11. System.out.println(customer2.getName());
  12. System.out.println(customer3.getName());
  13. System.out.println(customer4.getName());
  14. }
  15. }
  16. Java

第5步

验证输出,执行上面的代码得到以下结果 -

  1. Customers
  2. Rob
  3. Not Available in Customer Database
  4. Julie
  5. Not Available in Customer Database
  6. Java