假設(shè)我們要開發(fā)一個多人跳棋游戲。在跳棋游戲中,當(dāng)一個人走一步棋之后,控制權(quán)就輪到下一家,如此輪詢,一圈之后控制權(quán)又回到自己,然后再繼續(xù)輪圈下去。我們可以使用數(shù)組或列表等數(shù)據(jù)結(jié)構(gòu)來解決這種轉(zhuǎn)圈圈的問題,但是始終都不夠直觀。
我設(shè)計了 Circle 來對“圈”這種數(shù)據(jù)結(jié)構(gòu)進行抽象,我們在類似跳棋這樣的游戲中可以非常方便地直接使用它。
2. 適用場合:
需要類似“圈”這樣的數(shù)據(jù)結(jié)構(gòu)支持的場合。
3 .設(shè)計思想與實現(xiàn)
Circle 也是一個非常簡單的數(shù)據(jù)結(jié)構(gòu),其類圖如下所示:
從類圖中顯示的
Header
和
Tail
屬性,我們看出
Circle
就像一個真正的現(xiàn)實中焊接而成的鐵圈一樣,是有結(jié)合點的,這個結(jié)合點就是
Tail
與
Header
交接的地方。
Append 方法用于將一個新的對象附加到 Tail 后面,于是這個新的對象就變成了真正的 Tail 。
Insert 方法用于在指定的地方插入一個新對象,如果當(dāng)前 Circle 中沒有任何對象,則無論其指定的位置是哪里,都將被放置在 Header 的位置。
SetCurrent 方法用于將控制權(quán)轉(zhuǎn)交給參數(shù)指定的對象。如果指定的對象在 Circle 中不存在,則 SetCurrent 將不執(zhí)行任何操作。
MoveNext 方法和 MoveBack 方法表示將控制權(quán)轉(zhuǎn)移到下一家或上一家。
PeekNext 方法和 PeekBack 方法與 MoveNext 、 MoveBack 含義不一樣的地方在于: MoveNext 、 MoveBack 轉(zhuǎn)移了控制權(quán),而 PeekNext 和 PeekBack 沒有,它們只是返回下一家或上一家對象。
關(guān)于 Circle 的實現(xiàn)要注意以下幾點:
(1) Circle 的內(nèi)部是使用 List 來存放對象的。
(2) Circle 沒有進行任何加鎖控制,所以它不是線程安全的。我們類似跳棋這樣轉(zhuǎn)圈圈的游戲,通常都是以一個有序的順序來控制游戲的進行的,很少出現(xiàn)多個線程同時修改一個 Circle 的控制權(quán)的情況,所以在類似這樣的環(huán)境中, Circle 就不需要加鎖了。
(3)
注意,
InsertAt
方法和
RemoveAt
方法接收的參數(shù)
postionIndex
的值允許比內(nèi)部
List
的最大索引值還大,它們在實現(xiàn)時會對
postionIndex
進行求模運算,將
postionIndex
修正到正確的范圍內(nèi),在對
List
進行
Insert
和
Remove
操作。
4. 使用時的注意事項
(1) Insert 方法并不會改變 Circle 的當(dāng)前對象(即 Current 屬性的值)。
(2) 當(dāng) Circle 中不包含任何元素時, Header 、 Tail 和 Current 屬性返回的都是 default(T) 。如果 T 是引用類型,則這個值是 null 。
(3) 當(dāng) Circle 中只包含一個元素時, Header 和 Tail 屬性將返回同一個對象。
5. 擴展
圈 Circle 暫時沒有任何擴展。
在我們后面介紹的 CircleTaskSwitcher (循環(huán)任務(wù)切換器),它的實現(xiàn)就用到了本節(jié)的 Circle 。
注:ESBasic源碼可到
http://esbasic.codeplex.com/
下載。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
