ObjectBuilder技術內幕 五

2021-04-02 10:24:59 字數 4107 閱讀 7800

從前面的論述中,我們看到乙個物件的建立過程十分複雜和繁瑣,遠不是乙個

new那麼簡單,涉及到許多物件,建立器上下文、策略、方針等等等等。但由於採用了良好的設計模式,是這些眾多的物件協同工作次序井然。建立器採用建立者設計模式,把一系列物件的建立工作加以封裝,使呼叫者只要對其進行配置,然後呼叫

buildup

就可以得到最後的產品(要建立的物件),或者呼叫

teardown

來銷毀物件,

buildup

和teardown

是一對開閉操作,你使用

buildup

建立的物件,最好使用

teardown

將其銷毀。原因我想你也清楚,因為物件的建立如果涉及到其他物件(尤其是在依賴注入的情況下),使用

teardown

尤其重要。

teardown

會以物件被建立的相反次序解除安裝物件。下面是我們看建立器的**的時候了,同樣按照慣例從介面開始:

public

inte***ce

ibuilder

strategylist

strategies

object buildup(ireadwritelocator locator, type typetobuild, string idtobuild, object existing, params

policylist transientpolicies);

ttypetobuild buildup(ireadwritelocator locator, string idtobuild, object existing,

arams

policylist transientpolicies);

titem teardown(ireadwritelocator locator, titem item);

}ibuilder

介面就像我們期待的那樣簡單,兩個過載的

buildup

版本,乙個用於泛型。乙個

teardown

方法。兩個屬性:策略表和方針表。

可能你注意到有點和策略介面方法相同,乙個區別就是建立器的

buildup

方法引數和策略中的引數不同。由於物件的建立過程需要乙個建立器上下文,配置上下文的工作必須由建立器來完成。在

ibuilder

下是乙個抽象的

builderbase

基類,我們只講解主要部分:

private

dictionary

lockobjects = new

dictionary

();

該欄位成員用於支援多執行緒操作。

public

builderbase(ibuilderconfigurator

configurator)

構造器之一,引數

configurator

是實現了

ibuilderconfigurator

介面的類例項物件,通過這種方式,建立器的配置工作可以被分離到外部,使得對建立器的使用更加靈活。比如說你可以從

ibuilderconfigurator

介面實現乙個你自己的配置類,然後在

方法對傳遞給方法的

builder

物件進行配置(訪問者模式的應用)。

public

virtual

object buildup(ireadwritelocator locator, type typetobuild,

string idtobuild, object existing, params

policylist transientpolicies)

}else

}基類的預設

buildup

過程,如果定位器不為

null

,對定位器加鎖(阻止其他執行緒在此期間對它進行訪問)。呼叫

dobuildup

方法。dobuildup

方法如下:

private

object dobuildup(ireadwritelocator locator, type typetobuild, string idtobuild,

object

existing, policylist transientpolicies)

首先建立策略鏈,然後呼叫

throwifnostrategiesinchain

檢測,如果沒有策略(空鏈)則丟擲異常。我們從這裡可以看到派生類在呼叫基類的

buildup

之前,必須先把策略新增到策略表中。接下來是呼叫

makecontext

方法構造建立器上下文環境。接著查詢方針表看是否需要跟蹤。最後通過呼叫策略鏈的第乙個策略的

buildup

方法開始物件的建立過程。

makecontext

方法如下:

private

ibuildercontext makecontext(ibuilderstrategychain chain,

ireadwritelocator locator, params

policylist transientpolicies)

構造建立器上下文過程並不複雜,但是這裡要注意到乙個

transierntpolicies

引數,這是通過引數傳遞給

buildup

方法的稱為瞬間方針表,也就是說它並未被永久的儲存到

builder

物件的方針表中,僅在本次的建立過程有效。這種機制允許我們在建立乙個特殊物件時避免建立乙個新的建立器。

public

titem teardown(ireadwritelocator locator, titem item)

}else

}物件的拆卸過程,如果要拆卸的物件不是值型別同時是

null

的話,丟擲異常。如果定位器不為空,鎖住定位器(理由同

buildup),

然後呼叫

doteardown

方法,開始拆卸工作。

private

titem doteardown(ireadwritelocator locator, titem item)

拆卸物件的過程和建立過程正好相反,首先用一條反向的策略鏈(和建立過程的策略次序相反),然後呼叫

makecontext

方法建立乙個上下文環境,最後呼叫策略鏈的第乙個策略的

teardown

方法開始物件的拆卸過程。

private

object getlock(object locator)

}加鎖機制,使用前面定義的字典物件作為哨兵,如果字典中已經有定位器存在,就返回這個定位器,否則把定位器加入到字典中。

在抽象基類的層次下面,是

builder

的具體類,由於基類已經實現了基本的公共操作,剩下的操作由

builder

類來完成。

builder

類只有乙個構造器方法,這個方法我們前面已經看到了。我們沒有提到的是最後的兩行**:

policies.setdefault(new

defaultcreationpolicy());

if(configurator != null)

**在設定了策略之後,設定乙個指定乙個預設的建立方針。最後乙個語句作用和基類一樣,就不解釋了。

我們幾乎講述了

ob的全部**,還有一些例如自定義異常類等,相信你自己就能看明白。另外

cab中帶有

ob的單元測試**,如果你對某個類或者有些方法還不能完全理解的話,可以看相應的測試用例。

ob的設計中,包含了大量的設計模式,比如整個建立器就是建立者設計模式,模式的實現過程包含了責任鏈設計模式、策略設計模式、組合設計模式、模板方法設計模式、黑板設計模式、訪問者設計模式等,每一種設計模式都不是孤立的,如果你對設計模式的使用感到困惑,那麼

ob就是最好的教材。

本系列作為新年禮物送給大家,希望你們能夠喜歡。文稿沒有經過校對和潤色,有許多錯字別字,還望大家多多包涵,如果有什麼批評和建議,也請不吝賜教。

(全文完)

ObjectBuilder技術內幕(二)

有了定位器,就要涉及到物件的建立問題了。在 bo中物件的建立時根據所定義的物件策略並劃分不同的階段來進行。物件的階段定義使用乙個列舉型別,定義如下 public enum builderstage 四個階段層次分明。每乙個階段都有不同的策略,每個策略都有對應的方針,這些策略使用責任鏈設計模式,形成一...

技術就是技術

1.熟練閱讀彙編 2.會脫殼,有的遊戲加了強殼,防止反彙編分析 3.熟悉驅動程式的編寫,熟悉windows核心驅動。很多遊戲都安裝了驅動進行保護,防止你開啟程序,防止讀記憶體等等,需要寫驅動程式去解除安裝掉遊戲的一些保護 4.熟練使用ollydbg和ida,ce修改器等工具。5.熟練使用detour...

ofdma技術 SC FDMA技術

之前的文章中 mmdong2 ofdm 正交頻分復用 技術 zhuanlan.zhihu.com 提到過ofdm技術,因為能有效克服寬頻通訊系統中的頻率選擇性衰落,降低傳輸符號間干擾,基於ofdm技術的ofdma被納入4g lte和5g蜂窩通訊標準中。但如果有熟悉4g lte標準的讀者,會注意到of...