ObjectBuilder技術內幕(二)

2021-04-02 10:19:11 字數 3931 閱讀 3991

有了定位器,就要涉及到物件的建立問題了。在

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...