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