本文節選自《設計模式就該這樣學》
1 空對象模式的定義
空對象模式(Null Object Pattern)不屬於GoF設計模式,但是它作為一種經常出現的模式足以被視為設計模式了。其具體定義為設計一個空對象取代NULL對象實例的檢查。NULL對象不是檢查控制,而是反映一個不做任何動作的關系。這樣的NULL對象也可以在數據不可用的時候提供默認的行為,屬於行為型設計模式。
原文:Provide an object as a surrogate for the lack of an object of a given type. The Null object provides intelligent do nothing behavior, hiding the details from its collaborators.
2 空對象模式的應用場景
空對象模式適用於以下應用場景。
(1)對象實例需要一個協作實例。空對象模式不會引入協作實例,它只是使用現有的協作實例。
(2)部分協作實例不需要做任何處理。
(3)從客戶端中將對象實例不存在的代碼邏輯抽象出來。
3 空對象模式的UML類圖
空對象模式的UML類圖如下圖所示。
由上圖可以看到,空對象模式主要包含3個角色。
(1)抽象對象(AbstractObject):定義所有子類公有的行為和屬性。
(2)真實對象(RealObject):繼承AbstractObject類,並實現所有行為。
(3)空對象(NullObject):繼承AbstractObject類,對父類方法和屬性不做實現和賦值。
4 空對象模式的通用寫法
以下是空對象模式的通用寫法。
public class Client {
public static void main(String[] args) {
ObjectFactory factory = new ObjectFactory();
System.out.println(factory.getObject("Joe").isNill());
System.out.println(factory.getObject("Tom").isNill());
}
//抽象對象
static abstract class AbstractObject{
abstract void request();
abstract boolean isNill();
}
//空對象
static class NullObject extends AbstractObject{
public void request() {
System.out.println("Not Available Request");
}
boolean isNill() {
return true;
}
}
//真實對象
static class RealObject extends AbstractObject{
private String name;
public RealObject(String name) {
this.name = name;
}
public void request() {
System.out.println("Do samething...");
}
boolean isNill() {
return false;
}
}
//對象工廠
static class ObjectFactory{
private static final String[] names = {"Tom","Mic","James"};
public AbstractObject getObject(String name){
for (String n : names) {
if(n.equalsIgnoreCase(name)){
return new RealObject(name);
}
}
return new NullObject();
}
}
}
5 空對象模式的優點
(1)它可以加強系統的穩固性,能有效地減少空指針報錯對整個系統的影響,使系統更加穩定。
(2)它能夠實現對空對象情況的定制化的控制,掌握處理空對象的主動權。
(3)它並不依靠Client來保證整個系統的穩定運行。
(4)它通過定義isNull()對使用條件語句==null的替換,顯得更加優雅,更加易懂。
6 空對象模式的缺點
每一個要返回的真實的實體都要建立一個對應的空對象模型,那樣會增加類的數量。
關注微信公眾號『 Tom彈架構 』回復“設計模式”可獲取完整源碼。
本文為“Tom彈架構”原創,轉載請注明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力。關注微信公眾號『 Tom彈架構 』可獲取更多技術干貨!