摘要:概述在這個快速教程中,我們將看一下對象模式,這是設(shè)計模式的一個特例,一個經(jīng)常被我們遺忘的特例。對象模式的目的是最小化這種空檢查。何時使用空對象模式我們應(yīng)該使用對象模式,否則客戶端會檢查只是為了跳過執(zhí)行或執(zhí)行默認(rèn)操作。
概述
在這個快速教程中,我們將看一下Null對象模式,這是設(shè)計模式的一個特例,一個經(jīng)常被我們遺忘的特例。我們將描述它的目的以及我們何時應(yīng)該考慮使用它。
像往常一樣,我們還將提供一個簡單的代碼示例。
空對象模式在大多數(shù)面向?qū)ο蟮木幊陶Z言中,我們會考慮不進(jìn)行null引用,為此我們經(jīng)常被迫寫空檢查:
Command cmd = getCommand(); if (cmd != null) { cmd.execute(); }
有時,如果此類if語句的數(shù)量變多,則代碼的可讀性會變得很差,難以閱讀且容易出錯。這是Null對象模式可以派上用場的時候。
Null對象模式的目的是最小化這種空檢查。相反,我們可以識別null行為并將其封裝在客戶端代碼所期望的類中。這樣我們就不再需要處理空引用的特殊處理。
我們可以簡單地處理null對象,就像處理實(shí)際包含一些更復(fù)雜的業(yè)務(wù)邏輯的給定類型的任何其他實(shí)例一樣,以此來保持代碼的清潔。
由于null對象不應(yīng)具有任何狀態(tài),因此無需多次創(chuàng)建相同的實(shí)例。因此,我們經(jīng)常將null對象實(shí)現(xiàn)為單例。
Null Object Pattern的UML圖讓我們直觀地看一下模式:
我們可以看到,會有以下參與者:
客戶端需要AbstractObject的實(shí)例
AbstractObject定義客戶期望的執(zhí)行邏輯- 它還可以包含實(shí)現(xiàn)類的共享邏輯
RealObject實(shí)現(xiàn)了AbstractObject并提供了真實(shí)的行為
NullObject實(shí)現(xiàn)AbstractObject并提供do nothing行為
案例現(xiàn)在我們已經(jīng)清楚地了解了這個理論,讓我們看一個例子。
假設(shè)一個場景,有一個消息路由器模塊。每條消息都應(yīng)分配有效的優(yōu)先級。我們的系統(tǒng)應(yīng)該將高優(yōu)先級消息路由到SMS網(wǎng)關(guān),而具有中等優(yōu)先級的消息應(yīng)該路由到JMS隊列。
但是,有時會出現(xiàn)“未定義”或空優(yōu)先級的消息。這些消息應(yīng)該從進(jìn)一步處理中丟棄。
首先,我們將創(chuàng)建路由器接口:
public interface Router { void route(Message msg); }
接下來,讓我們創(chuàng)建上述接口的兩個實(shí)現(xiàn) - 負(fù)責(zé)路由到SMS網(wǎng)關(guān)的接口以及將消息路由到JMS隊列的接口:
public class SmsRouter implements Router { @Override public void route(Message msg) { // implementation details } }
public class JmsRouter implements Router { @Override public void route(Message msg) { // implementation details } }
最后,讓我們實(shí)現(xiàn)我們的null對象:
public class NullRouter implements Router { @Override public void route(Message msg) { // do nothing } }
我們現(xiàn)在準(zhǔn)備將所有部分組合在一起。讓我們看看示例客戶端代碼的外觀如何:
public class RoutingHandler { public void handle(Iterablemessages) { for (Message msg : messages) { Router router = RouterFactory.getRouterForMessage(msg); router.route(msg); } } }
我們可以看到,無論RouterFactory返回什么實(shí)現(xiàn),我們都以相同的方式處理所有Router對象。這使我們能夠保持代碼的清潔和可讀性。
何時使用空對象模式我們應(yīng)該使用Null對象模式,否則客戶端會檢查null只是為了跳過執(zhí)行或執(zhí)行默認(rèn)操作。 在這種情況下,我們可以將do nothing邏輯封裝在空對象中,并將其返回給客戶端而不是空值。這樣,如果給定實(shí)例為null,則客戶端代碼不再需要知道?。
這種方法也遵循一般的面向?qū)ο笤瓌t。
為了更好地理解何時應(yīng)該使用Null對象模式,讓我們假設(shè)我們必須實(shí)現(xiàn)CustomerDao接口,定義如下:
public interface CustomerDao { CollectionfindByNameAndLastname(String name, String lastname); Customer getById(Long id); }
如果沒有客戶匹配提供的搜索條件,大多數(shù)開發(fā)人員將從findByNameAndLastname()返回Collections.emptyList()。這是遵循Null對象模式的一個很好的例子。
相反,getById()應(yīng)返回具有給定id的客戶。調(diào)用此方法的人希望獲得特定的客戶實(shí)體。如果不存在這樣的客戶,我們應(yīng)該顯式返回null以表示提供的ID存在問題。
與所有其他模式一樣,我們需要在盲目實(shí)現(xiàn)Null對象模式之前考慮我們的特定用例。否則,我們可能會無意中在代碼中引入一些很難找到的錯誤。
結(jié)論在本文中,我們了解了Null對象模式是什么以及何時可以使用它。我們還實(shí)現(xiàn)了一個設(shè)計模式的簡單示例。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73825.html
摘要:二用操作符構(gòu)造對象屬性名屬性值屬性名屬性值屬性名屬性值屬性名屬性值方法名方法名首先用創(chuàng)建一個空對象,然后用多條語句給對象添加屬性方法。他的寫法與三用函數(shù)聲明的方式構(gòu)造對象比較像,但是稍有不同。 -- 新手向知識,就不用ES6寫法了。 一、字面量聲明 var obj = { 屬性名1 : 屬性值, 屬性名2 : 屬性值, 屬性名3 : 屬性...
摘要:,命令模式,將行為請求者和行為實(shí)現(xiàn)者解耦,將行為抽象為對象。解釋器模式,迭代器模式,將集合對象的存儲數(shù)據(jù)和遍歷數(shù)據(jù)職責(zé)分離。即將遍歷的責(zé)任交給迭代器返回的迭代器,迭代器。 設(shè)計模式總結(jié) 創(chuàng)建型:除了直接new來實(shí)例化對象外,提供了多種隱藏創(chuàng)建邏輯的生成對象的方法 結(jié)構(gòu)型:通過對象和類的組合,得到新的結(jié)構(gòu)和功能 行為型:解決對象之間的通行和功能職責(zé)分配 詳細(xì)分類 工廠 簡單工廠...
摘要:這個模式感覺一一般和工廠模式一起使用的比較多比較方便結(jié)構(gòu)型模式這些設(shè)計模式關(guān)注類和對象的組合。設(shè)計模式這些設(shè)計模式特別關(guān)注表示層。 設(shè)計模式的的六大原則: 學(xué)習(xí)設(shè)計模式之前最好先了解一下設(shè)計模式的設(shè)計原則: 1. 開閉原則(open close principle) 開放即指對擴(kuò)展開放,對修改關(guān)閉 簡而言之,就是擴(kuò)展功能的時候應(yīng)該盡量的不修改原有的代碼。 2. 里氏代換原則(lisko...
摘要:命令執(zhí)行時,構(gòu)造函數(shù)內(nèi)部的,就代表了新生成的實(shí)例對象,表示實(shí)例對象有一個屬性,值是。因此,應(yīng)該非常小心,避免不使用命令直接調(diào)用構(gòu)造函數(shù)。命令返回這個對象,而不是對象。JavaScript 面向?qū)ο缶幊痰幕A(chǔ)知識篇 1 。 1. 概述 面向?qū)ο缶幊蹋∣bject Oriented Programming,縮寫為 OOP)是目前主流的編程范式。 那么,對象(object)到底是什么? 對象是單...
閱讀 641·2021-11-24 09:39
閱讀 3485·2019-08-30 15:53
閱讀 2519·2019-08-30 15:44
閱讀 3245·2019-08-30 12:54
閱讀 2212·2019-08-29 12:23
閱讀 3309·2019-08-26 14:05
閱讀 2111·2019-08-26 13:36
閱讀 3441·2019-08-26 13:33