設計模式之空對象模式(Null Object Pattern)

設計模式之空對象模式(Null Object Pattern)

存在有道理

  1. 痛點

    class User {
    	public String show(){
    		return "show"
    	}
    }
    public  static String show(User user){
    	if(null!=user)
    		return user.show()
    	return null;
    }
    

    如上的代碼我們每天都在寫,避免空指針錯誤
    思考,如果我能保證對象不爲空呢,或者爲空得時候也是一個特殊得對象,並且有一個最低得方法實現呢,這樣,我就不需要到處寫空置判斷呢,這裏應該要配合工廠模式,或者建造者模式,保證生成得對象一定存在

解決方案

空對象模式

  1. 結構圖
    在這裏插入圖片描述

  2. 用特殊對象表示空的情況,並且實現對應的方法,這樣特殊空情況也能執行方法,這樣就不需要判斷是否爲空了,需要一個生成對象得三種中介類,一般工廠模式等

  3. 上代碼

public class NullObjectPattern {

    public static void main(String[] args) {
        //--------------平時我們正常使用得時候--------
        DriverFactory factory = new DriverFactory();
        Driver driver = factory.normal("cuowude");//傳一個錯誤類型進去
        if (null != driver) {
            driver.drive();
        }


        ////---------空對象模式----------------
        DriverFactory nullObjectFactory=new DriverFactory();
        Driver nullObjectDriver=factory.getNullObject("error");
        nullObjectDriver.drive();//這裏不需要做任何空指針判斷,因爲對象一定不會爲空

    }

}

interface Driver {

    String PERSION_TYPE = "persion";
    String DOG_TYPE = "dog";

    void drive();
}

class PersonDriver implements Driver {

    @Override
    public void drive() {
        System.out.println("Persion drive");
    }
}

class DogDriver implements Driver {

    @Override
    public void drive() {
        System.out.println("Dog drive");
    }
}

class NullDriver implements Driver {

    @Override
    public void drive() {
        System.out.println("Null drive");
    }
}

class DriverFactory {

    public Driver normal(String driverType) {
        switch (driverType) {
            case Driver.PERSION_TYPE:
                return new PersonDriver();
            case Driver.DOG_TYPE:
                return new DogDriver();
        }
        return null;
    }

    public Driver getNullObject(String driverType) {
        switch (driverType) {
            case Driver.PERSION_TYPE:
                return new PersonDriver();
            case Driver.DOG_TYPE:
                return new DogDriver();
        }
        return new NullDriver();
    }
}

  1. 運行結果
    在這裏插入圖片描述

  2. 代碼gitee地址:空對象模式demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章