数据结构~工作流的设计(链表结构)
从几年前做OA时接触过工作流的概念,那时还比较模糊,现在觉得清晰一些了,想把自己一些理解写出来,与大家分享!
工作流最简单的就是京东的订单处理,它其实就是个简单的工作流,每个节点可能有前驱节点(prev node)和后继节点(next node),如图:
而这个结构让我们想起了数据结构里的“链表”(链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。),更多链表的基础可以看我这篇文章。
而反映到C#中,我们可以把链接结构设计成这样的类,而对于数据表来说也是这样的数据结构:
反映到类中,是这样定义的:
1 public partial class WorkFlow_Info 2 { 3 public int ID { get; set; } 4 public Nullable<int> PrevNode { get; set; } 5 public Nullable<int> NextNode { get; set; } 6 public string Name { get; set; } 7 public string Info { get; set; } 8 }
它有一些导航属性,用来得到每个节点的前驱和后继节点信息:
1 /// <summary> 2 /// 工作流实体 3 /// </summary> 4 [MetadataType(typeof(WorkFlow_Info_Meta))] 5 public partial class WorkFlow_Info 6 { 7 #region 导航属性 8 /// <summary> 9 /// 是否为首结点 10 /// </summary> 11 public bool IsFirstNode 12 { 13 get 14 { 15 return this.PrevNode == null; 16 } 17 } 18 /// <summary> 19 /// 是否为尾结点 20 /// </summary> 21 public bool IsEndNode 22 { 23 get 24 { 25 return this.NextNode == null; 26 } 27 } 28 /// <summary> 29 /// 前驱节点 30 /// </summary> 31 public WorkFlow_Info PrevNodeEntity { get; set; } 32 /// <summary> 33 /// 后继节点 34 /// </summary> 35 public WorkFlow_Info NextNodeEntity { get; set; } 36 #endregion 37 }
好了,有了上面的基础,我们把这个结构体现到实际项目中,如一个产品从建立到最后的上架,可能就是一个工作流,它的流程如:
建立产品=》审核产品信息=》产品订价=》产品上架
而我们再结合之前的链表结果,可以很容易的得到下面的结果了:
A产品是刚刚被建立,还没有进行审核(被建立)
B产品已经经过了审核(被审核)
C产品当前已经处于上价状态了(被上架)