有了定位器,就要涉及到物件的建立問題了。在
bo中物件的建立時根據所定義的物件策略並劃分不同的階段來進行。物件的階段定義使用乙個列舉型別,定義如下:
public
enum
builderstage
四個階段層次分明。每乙個階段都有不同的策略,每個策略都有對應的方針,這些策略使用責任鏈設計模式,形成一條流水線,乙個物件的建立過程就像是乙個產品經過一條精心設計的加工流水線一樣。策略類的介面定義如下:
public
inte***ce
ibuilderstrategy
從**中看,
ob並不僅僅要負責物件的建立,也要負責物件的銷毀工作。因為採用責任鏈模式,所以需要設計乙個上下文物件來儲存和傳遞必要資訊。這個上下文就是實現了
ibuildercontext
介面的類。我們先來看一下
ibuidlercontext
介面的定義:
public
inte***ce
ibuildercontext
//定位器
ireadwritelocator locator
//提供給策略使用的方針表
policylist policies
//當前策略的下乙個建造策略的引用
ibuilderstrategy getnextinchain(ibuilderstrategy currentstrategy);
}介面中有乙個陌生的成員就是方針表。在熟悉它之前,我們先看看什麼方針的介面定義:
public
inte***ce
ibuilderpolicy
哈,很失望是不是,介面中什麼都沒有!這是乙個標識性的介面,它沒有定義方法。因為它是提供給策略使用的,所以讓策略來決定乙個方針需要什麼方法。
為了實現不同的建立策略,策略類的家族定義了乙個公共的基類:
public
abstract
class
builderstrategy : ibuilderstrategy
public
virtual
object buildup(ibuildercontext context, type typetobuild, object existing, string idtobuild)
public
virtual
object teardown(ibuildercontext context, object item)
protected
string parameterstotypelist(params
object parameters)
protected
void tracebuildup(ibuildercontext context, type typetobuild, string idtobuild, string format, params
object args)
}protected
void traceteardown(ibuildercontext context, object item, string format, params
object args)
}protected
bool traceenabled(ibuildercontext context)
}這個基類實現了最基本的介面方法
buildup
和teardown
,兩個**過程是相似的,也就是從上下文獲取下乙個策略(如果有的話),然後下乙個策略的相同方法。最後把物件返回。其他的幾個方法是輔助方法,便於
debug
中跟蹤資訊,跟蹤資訊則是採用實現了
ibuidlertracepolicy
介面的類來進行。最後乙個方法用來檢測乙個方針表中是否存在乙個跟蹤方針,如果沒有,則表示不跟蹤資訊。從這幾個輔助方法,我們也看到了策略是如何使用方針的,這是乙個基類,它通過呼叫跟蹤方針的
trace
方法來對要建立的類進行跟蹤(如果存在跟蹤方針的化)。
乙個責任鏈設計模式,應該存在一條鏈,在
ob中這條鏈就是策略鏈,策略鏈的設計由乙個介面定義和乙個具體實現類組成,它們實際上是乙個鍊錶結構,實現的方法也是鍊錶的操作方法(**略)。但是,注意到乙個事實,那就是策略鏈沒有對鍊錶中策略進行刪除的方法,這是否表示乙個策略一旦新增到建立過程中就不能被刪除了呢?非也,其實策略鏈僅僅扮演定位策略在鏈中的次序,真正的策略是儲存在策略表中。
strategylist
類按照不同的建立階段對策略進行分組儲存,每乙個階段乙個節點,每個節點儲存這個相同階段的策略,這種實現通過乙個內部的字典物件來進行:
public
class
strategylist
策略表的功能是把策略新增到對應的階段中、清除指定階段的策略、清除全部策略。除此之外策略表還提供轉配策略鍊錶的工作,方法
makestrategychain()
用於裝配正向鍊錶,方法
makereversestrategychain()
用於裝配反向鍊錶。兩個方法中的**都很容易理解。類中每個方法中的
lock()
語句是為了支援多執行緒。
方針表也是採用字典結構來儲存方針,和策略表不同的是,方針表並不區分建立階段。方針表中儲存的每乙個方針物件在整個建立期間可以被任何策略所訪問。不同的策略從方針表中讀寫相應的資料,大部分的資料也是通過方針表中的方針來傳遞。每乙個儲存在方針表中的方針通過乙個稱為方針鍵的物件作為它們在字典中的索引,這個鍵被設計為結構型別:
public
struct
builderpolicykey
private
type policytype;
private
type buildtype;
private
string buildid;
}這個結構的字段都是私有的,想想為什麼?注意到結構型別是值型別這樣乙個事實,那麼具有相同字段值的兩個結構值也是相同,所以把這樣的結構作為鍵就很合適。
方針表中幾個過載的
set和
get方法的**不難看懂,所以就不作詳細解釋了。乙個有趣的問題大家可以來思考,那就是會重複儲存相同的方針物件嗎?需要說明的是方針表中可以設定乙個預設的方針,方針表提供了設定和清除預設方針的方法,預設的方針表示該方針可以被應用到任何乙個要建立的物件上面。
前面我們介紹了建立器上下文的介面定義,也提到了建立器上下文是用來儲存建立過程中的資訊的,所以我們以這個建立器上下文的具體類作為本章的結束:
public
class
buildercontext : ibuildercontext
public buildercontext(ibuilderstrategychain chain, ireadwritelocator locator, policylist policies)
public
ibuilderstrategy headofchain
}public
ireadwritelocator locator
}protected
void setlocator(ireadwritelocator locator)
public
policylist policies
}protected
void setpolicies(policylist policies)
protected
ibuilderstrategychain strategychain
set
}public
ibuilderstrategy getnextinchain(ibuilderstrategy currentstrategy)
}buildercontext
類作為建立過程的資訊載體,它包含了乙個策略鍊錶,乙個策略使用的方針表以及乙個用來儲存建立物件的定位器。方法和**不需要更多的解釋,相信大家都能看懂。
ObjectBuilder技術內幕 五
從前面的論述中,我們看到乙個物件的建立過程十分複雜和繁瑣,遠不是乙個 new那麼簡單,涉及到許多物件,建立器上下文 策略 方針等等等等。但由於採用了良好的設計模式,是這些眾多的物件協同工作次序井然。建立器採用建立者設計模式,把一系列物件的建立工作加以封裝,使呼叫者只要對其進行配置,然後呼叫 buil...
技術就是技術
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...