• 圈 Circle--ESBasic 可复用的.NET类库(03)


      1.缘起:

        假设我们要开发一个多人跳棋游戏。在跳棋游戏中,当一个人走一步棋之后,控制权就轮到下一家,如此轮询,一圈之后控制权又回到自己,然后再继续轮圈下去。我们可以使用数组或列表等数据结构来解决这种转圈圈的问题,但是始终都不够直观。

        我设计了Circle来对“圈”这种数据结构进行抽象,我们在类似跳棋这样的游戏中可以非常方便地直接使用它。

    Circle的形象示意图如下:
        
     

    2.适用场合:

           需要类似“圈”这样的数据结构支持的场合。
     

    3.设计思想与实现

        Circle也是一个非常简单的数据结构,其类图如下所示:

     

     
        从类图中显示的
    HeaderTail属性,我们看出Circle就像一个真正的现实中焊接而成的铁圈一样,是有结合点的,这个结合点就是TailHeader交接的地方。

    Append方法用于将一个新的对象附加到Tail后面,于是这个新的对象就变成了真正的Tail

    Insert方法用于在指定的地方插入一个新对象,如果当前Circle中没有任何对象,则无论其指定的位置是哪里,都将被放置在Header的位置。

    SetCurrent方法用于将控制权转交给参数指定的对象。如果指定的对象在Circle中不存在,则SetCurrent将不执行任何操作。

    MoveNext方法和MoveBack方法表示将控制权转移到下一家或上一家。

    PeekNext方法和PeekBack方法与MoveNextMoveBack含义不一样的地方在于:MoveNextMoveBack转移了控制权,而PeekNextPeekBack没有,它们只是返回下一家或上一家对象。

    关于Circle的实现要注意以下几点:

    (1)Circle的内部是使用List来存放对象的。

    (2)Circle没有进行任何加锁控制,所以它不是线程安全的。我们类似跳棋这样转圈圈的游戏,通常都是以一个有序的顺序来控制游戏的进行的,很少出现多个线程同时修改一个Circle的控制权的情况,所以在类似这样的环境中,Circle就不需要加锁了。

    (3)注意,InsertAt方法和RemoveAt方法接收的参数postionIndex的值允许比内部List的最大索引值还大,它们在实现时会对postionIndex进行求模运算,将postionIndex修正到正确的范围内,在对List进行InsertRemove操作。
     

    4. 使用时的注意事项

    (1)Insert方法并不会改变Circle的当前对象(即Current属性的值)。

    (2)Circle中不包含任何元素时,HeaderTailCurrent属性返回的都是default(T)。如果T是引用类型,则这个值是null

    (3)Circle中只包含一个元素时,HeaderTail属性将返回同一个对象。

    5.扩展

    Circle暂时没有任何扩展。

    在我们后面介绍的CircleTaskSwitcher(循环任务切换器),它的实现就用到了本节的Circle


        注: ESBasic已经开源,点击这里下载源码。

  • 相关阅读:
    看MySQL官方文档的示例SQL有感
    MySQL 主外键约束与标准SQL不同的地方
    pip安装包时遇到的Bug
    MySQL update 语句与标准SQL不同的地方
    让MySQL在美国标准下运行
    mysqlslap 压力测试工具
    django 自动化测试的故障排查
    mysql-8.0.11 比较坑的地方dba门要淡定
    python3 如何给装饰器传递参数
    python3 装饰器应用举例
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1556348.html
Copyright © 2020-2023  润新知