空對象模式(Null Object Pattern)


本文節選自《設計模式就該這樣學》

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彈架構:30個設計模式真實案例(附源碼),挑戰年薪60W不是夢

本文為“Tom彈架構”原創,轉載請注明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力。關注微信公眾號『 Tom彈架構 』可獲取更多技術干貨!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM