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

推薦閱讀:被遺忘的設計模式

相關文章
相關標籤/搜索