本文節(jié)選自《設(shè)計(jì)模式就該這樣學(xué)》
1 空對(duì)象模式的定義
空對(duì)象模式(Null Object Pattern)不屬于GoF設(shè)計(jì)模式寝志,但是它作為一種經(jīng)常出現(xiàn)的模式足以被視為設(shè)計(jì)模式了讯壶。其具體定義為設(shè)計(jì)一個(gè)空對(duì)象取代NULL對(duì)象實(shí)例的檢查闻丑。NULL對(duì)象不是檢查控制惧眠,而是反映一個(gè)不做任何動(dòng)作的關(guān)系勤晚。這樣的NULL對(duì)象也可以在數(shù)據(jù)不可用的時(shí)候提供默認(rèn)的行為猖败,屬于行為型設(shè)計(jì)模式没隘。
原文: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 空對(duì)象模式的應(yīng)用場景
空對(duì)象模式適用于以下應(yīng)用場景砚作。
(1)對(duì)象實(shí)例需要一個(gè)協(xié)作實(shí)例窘奏。空對(duì)象模式不會(huì)引入?yún)f(xié)作實(shí)例葫录,它只是使用現(xiàn)有的協(xié)作實(shí)例。
(2)部分協(xié)作實(shí)例不需要做任何處理米同。
(3)從客戶端中將對(duì)象實(shí)例不存在的代碼邏輯抽象出來。
3 空對(duì)象模式的UML類圖
空對(duì)象模式的UML類圖如下圖所示。
由上圖可以看到婿脸,空對(duì)象模式主要包含3個(gè)角色盖淡。
(1)抽象對(duì)象(AbstractObject):定義所有子類公有的行為和屬性年柠。
(2)真實(shí)對(duì)象(RealObject):繼承AbstractObject類,并實(shí)現(xiàn)所有行為褪迟。
(3)空對(duì)象(NullObject):繼承AbstractObject類冗恨,對(duì)父類方法和屬性不做實(shí)現(xiàn)和賦值。
4 空對(duì)象模式的通用寫法
以下是空對(duì)象模式的通用寫法味赃。
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());
}
//抽象對(duì)象
static abstract class AbstractObject{
abstract void request();
abstract boolean isNill();
}
//空對(duì)象
static class NullObject extends AbstractObject{
public void request() {
System.out.println("Not Available Request");
}
boolean isNill() {
return true;
}
}
//真實(shí)對(duì)象
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;
}
}
//對(duì)象工廠
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 空對(duì)象模式的優(yōu)點(diǎn)
(1)它可以加強(qiáng)系統(tǒng)的穩(wěn)固性掀抹,能有效地減少空指針報(bào)錯(cuò)對(duì)整個(gè)系統(tǒng)的影響,使系統(tǒng)更加穩(wěn)定心俗。
(2)它能夠?qū)崿F(xiàn)對(duì)空對(duì)象情況的定制化的控制傲武,掌握處理空對(duì)象的主動(dòng)權(quán)。
(3)它并不依靠Client來保證整個(gè)系統(tǒng)的穩(wěn)定運(yùn)行城榛。
(4)它通過定義isNull()對(duì)使用條件語句==null的替換揪利,顯得更加優(yōu)雅,更加易懂狠持。
6 空對(duì)象模式的缺點(diǎn)
每一個(gè)要返回的真實(shí)的實(shí)體都要建立一個(gè)對(duì)應(yīng)的空對(duì)象模型疟位,那樣會(huì)增加類的數(shù)量。
關(guān)注『 Tom彈架構(gòu) 』回復(fù)“設(shè)計(jì)模式”可獲取完整源碼喘垂。
【推薦】Tom彈架構(gòu):30個(gè)設(shè)計(jì)模式真實(shí)案例(附源碼)甜刻,挑戰(zhàn)年薪60W不是夢
本文為“Tom彈架構(gòu)”原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處正勒。技術(shù)在于分享得院,我分享我快樂!
如果本文對(duì)您有幫助章贞,歡迎關(guān)注和點(diǎn)贊祥绞;如果您有任何建議也可留言評(píng)論或私信,您的支持是我堅(jiān)持創(chuàng)作的動(dòng)力。關(guān)注『 Tom彈架構(gòu) 』可獲取更多技術(shù)干貨蜕径!