原文連接html
譯者:smallcloverjava
Thanks for your watching設計模式
在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