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

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