我的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)怎么简单而清晰的保证控制流正确性。
但是又一新问题出现了,两个不相同的流程怎么来处理呢?
你也可以想想吧。。休息休息。


浙公网安备 33010602011771号