我的Workflow之旅--自己写简单workflow引擎(二)

直接进入正题,接着上篇说的怎么控制流呢?

  我们需要一个层次结构而且有统一操作的接口的可恢复语句组件 设计模式中的组合模式(将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性)正是我们需要的一种解耦方式。可以这么定义一个复合组件基类:

代码
namespace MyWorkflow
{
[Serializable]
public abstract class ComponetActive:Active
{
public ComponetActive()
:
base("ComponetActive") { }
public ComponetActive(string name)
:
base(name) { }

List
<Active> actives = new List<Active>();

public IList<Active> ChildActives
{
get { return actives; }
}
}
}

这样我们就可以定义出复杂的逻辑块。我来看看我们实现一个If else的语法结构控制:

代码
namespace MyWorkflow
{
public class IfElse:ComponetActive
{
public Func<bool> Condition { get; set; }//外部条件

public IfElse(Func<bool> condition,Active ifThen,Active elseThen)
{
Condition
= condition;
this.ChildActives.Add(ifThen);
this.ChildActives.Add(elseThen);
}

public override void Execute(BookmarkManager mgr)
{
if (Condition())
mgr.RunActive(ChildActives[
0], ContinueAt);
else
mgr.RunActive(ChildActives[
1], ContinueAt);

}

public void ContinueAt(Bookmark resumed)
{
resumed.BookmarkManager.Done();
}
}
}

再来尝试写个DoWhile 控制流:

 

代码
namespace MyWorkflow
{
public class DoWhile : ComponetActive
{
public Func<bool> Condition { get; set; }//外部条件

public DoWhile(Func<bool> condition,Active doActive)
{
this.Condition = condition;
ChildActives.Add(doActive);
}

public override void Execute(BookmarkManager mgr)
{
mgr.RunActive(ChildActives[
0], ContinueAt);
}

void ContinueAt(Bookmark resumed)
{
if(Condition())
resumed.BookmarkManager.RunActive(ChildActives[
0], ContinueAt);
else
resumed.BookmarkManager.Done();
}
}
}

 

 

 

以此类推,我们可以自己尝试写其他的控制流组件。到此我们可以解决前面提出的问题

  1)所谓交互式程序就是程序在执行期间依赖外部实体的刺激,并对此做出响应。而这些交互式程序都将花费大量的时间在等待这些刺激。

 

  2)怎么简单而清晰的保证控制流正确性。

但是又一新问题出现了,两个不相同的流程怎么来处理呢?

  你也可以想想吧。。休息休息。

posted @ 2010-05-24 02:04  木吉他-.-  阅读(373)  评论(0)    收藏  举报