設計模式之空對象模式(Null Object Pattern)
存在有道理
-
痛點
class User { public String show(){ return "show" } } public static String show(User user){ if(null!=user) return user.show() return null; }
如上的代碼我們每天都在寫,避免空指針錯誤
思考,如果我能保證對象不爲空呢,或者爲空得時候也是一個特殊得對象,並且有一個最低得方法實現呢,這樣,我就不需要到處寫空置判斷呢,這裏應該要配合工廠模式,或者建造者模式,保證生成得對象一定存在
解決方案
空對象模式
-
結構圖
-
用特殊對象表示空的情況,並且實現對應的方法,這樣特殊空情況也能執行方法,這樣就不需要判斷是否爲空了,需要一個生成對象得三種中介類,一般工廠模式等
-
上代碼
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();
}
}
-
運行結果
-
代碼gitee地址:空對象模式demo