Design Patterns-Null Object Pattern(译)

原文连接html

译者:smallcloverjava

Thanks for your watching设计模式

设计模式-Null Object Pattern

在Null Object①设计模式中,一个Null Object替换对一个值为null的object的检查,而不是经过if语句来判断该值是否是为null。Null Object反映了一种do-nothing②的关系。这样的Null Object也能够用于提供默认行为,当数据不可用时。
在 Null Object 模式中,咱们建立一个 抽象类声明了各类各样须要之执行的操做,建立具体的类继承这个抽象类,而且建立一个Null Object类来提供do-nothing的实现,同时也能在咱们须要的时候帮咱们检测null值。ide

译注 this

① Null Object 直译的话就是空对象,感受不够优雅,并且不太符合它的实际意义,因此暂时使用英文单词来代替。这里的Null Object不是指对象的值为null(Object object = null)而是指,该对象表达的是Null的含义。咱们人为的为null赋予具体的含义,让null表明一种特殊的数据状态。来使程序语义更加的明确,避免空值和null等数据值使得程序语义混乱,以及null值致使程序的崩溃等等。这种为null赋予具体含义的思想 在Google的java类库guava中有很好的实现。spa

② 在本文中do-nothing 指,若对象的值为null时,将不作任何动做。设计

实现

咱们将建立一个抽象类AbstractCustomer,该类声明了两个方法以及记录客户端名字的属性值。建立具体的类集成该抽象类。工厂类CustomerFactory经过 客户端传递给它的名字来建立并返回RealCustomer或者NullCustomer的对象。
NullPatternDemo,咱们的demo类,将使用CustomerFactory来展现如何使用NullObjectPattern。code

图片描述

第一步

建立抽象类htm

AbstractCustomer.java 对象

public abstract class AbstractCustomer {
   protected String name;
   public abstract boolean isNil();
   public abstract String getName();
}

第二步

建立具体的类继承抽象类 AbstractCustomer.java

RealCustomer.java

public class RealCustomer extends AbstractCustomer {

   public RealCustomer(String name) {
      this.name = name;        
   }

   @Override
   public String getName() {
      return name;
   }

   @Override
   public boolean isNil() {
      return false;
   }
}

NullCustomer.java

public class NullCustomer extends AbstractCustomer {

   @Override
   public String getName() {
      return "Not Available in Customer Database";
   }

   @Override
   public boolean isNil() {
      return true;
   }
}

第三步

建立CustomerFactory类

CustomerFactory.java

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();
   }
}

第四步

使用CustomerFactory类经过customer传递的name值来获取RealCustomer或者NullCustomer类的对象.

NullPatternDemo.java

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());
   }
}

第五步

校验输出

Customers
Rob
Not Available in Customer Database
Julie
Not Available in Customer Database

推荐阅读:被遗忘的设计模式

相关文章
相关标签/搜索