從前面的論述中,我們看到乙個物件的建立過程十分複雜和繁瑣,遠不是乙個
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
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
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...