关于使用“状态模式”做工作流概要。

最近,以前一名同事问了一下工作流的事情,我现在将太概的模式写一下。
临时写的,可能有点乱,如果需要创建一个新的工作流模板的时候请新建一个工作流序列类,职责单一便于维护。
   
     
using System;
using System.Collections.Generic;
using System.Text;

namespace WF
{
/// <summary>
/// 工程名称:通过工作流状态进行工作流管理
/// <para> Author:Evan Lee </para>
/// <para> 编写时间:2011-05-08 </para>
/// <para> 博客地址: http://www.cnblogs.com/magic_evan </para>
/// </summary>
class Program
{
/// <summary>
/// 通过工作流状态进行工作流管理
/// </summary>
/// <param name="args"></param>
static void Main( string [] args)
{
int start = 0 ;
while ( true )
{
// 模板方式的工作流可以编写成模板工厂类的方式
int .TryParse(Console.ReadLine(), out start);
Work work
= null ;
Dictionary
< int , int > stepList = new Dictionary < int , int > (); // 工作流模板的每一步的的状态<工作流步骤,工作流状态>
switch (start)
{
case 1 : // 输入1的时候启用第1个工作流的模板
work = new Work( 1 );
stepList.Add(
1 , 0 );
stepList.Add(
2 , 0 );
work.StepList
= stepList;
break ;
case 2 : // 输入2的时候启用第2个工作流的模板
work = new Work( 2 );
stepList.Add(
1 , 1 );
stepList.Add(
2 , 0 );
stepList.Add(
3 , 0 );
work.StepList
= stepList;
break ;
default : return ; // 其它跳出
}
work.DoWork();
}
}
}

// 工作流抽象状态
public abstract class State
{
public abstract void DoWork(Work w);
}

// 工作流1
public class wf1 : State
{
public override void DoWork(Work w)
{
if (w.IsStop)
return ;
if (w.StepList[w.CurrentStep] > 0 )
{
Console.WriteLine(
" {0}步工作流完成!显示内容 " , w.CurrentStep = w.CurrentStep - 1 );
}
else
{
Console.WriteLine(
" {0}步工作流未完成!显示输入内容 " , w.CurrentStep = w.CurrentStep - 1 );
w.IsStop
= true ;
}

w.SetState(
new wf1_1());
w.DoWork();
}
}
// 工作流1-1
public class wf1_1 : State
{
public override void DoWork(Work w)
{
if (w.IsStop)
return ;
if (w.StepList[w.CurrentStep] > 0 )
{
Console.WriteLine(
" {0}步工作流完成!显示内容 " , w.CurrentStep = w.CurrentStep - 1 );
}
else
{
Console.WriteLine(
" {0}步工作流未完成!显示输入内容 " , w.CurrentStep = w.CurrentStep - 1 );
w.IsStop
= true ;
}
w.SetState(
new wfend());
w.DoWork();
}
}
// 工作流2
public class wf2 : State
{
public override void DoWork(Work w)
{
if (w.IsStop)
return ;
if (w.StepList[w.CurrentStep] > 0 )
{
Console.WriteLine(
" {0}步工作流完成!显示内容 " , w.CurrentStep = w.CurrentStep - 1 );
}
else
{
Console.WriteLine(
" {0}步工作流未完成!显示输入内容 " , w.CurrentStep = w.CurrentStep - 1 );
w.IsStop
= true ;
}
w.SetState(
new wf2_1());
w.DoWork();
}
}
// 工作流2-1
public class wf2_1 : State
{
public override void DoWork(Work w)
{
if (w.IsStop)
return ;
if (w.StepList[w.CurrentStep] > 0 )
{
Console.WriteLine(
" {0}步工作流完成!显示内容 " , w.CurrentStep = w.CurrentStep - 1 );
}
else
{
Console.WriteLine(
" {0}步工作流未完成!显示输入内容 " , w.CurrentStep = w.CurrentStep - 1 );
w.IsStop
= true ;
}
w.SetState(
new wf2_2());
w.DoWork();
}
}
// 工作流2-2
public class wf2_2 : State
{
public override void DoWork(Work w)
{
if (w.IsStop)
return ;
if (w.StepList[w.CurrentStep] > 0 )
{
Console.WriteLine(
" {0}步工作流完成!显示内容 " , w.CurrentStep = w.CurrentStep - 1 );
}
else
{
Console.WriteLine(
" {0}步工作流未完成!显示输入内容 " , w.CurrentStep = w.CurrentStep - 1 );
w.IsStop
= true ;
}
w.SetState(
new wfend());
w.DoWork();
}
}

public class wfend : State
{
public override void DoWork(Work w)
{
Console.WriteLine(
" 工作流完成!显示内容 " );
}
}


// 工作
public class Work
{
private State current;
public Work( int wfModel)
{
switch (wfModel)
{
case 1 : current = new wf1(); break ;
case 2 : current = new wf2(); break ;
}
}

private Dictionary < int , int > stepList = new Dictionary < int , int > ();
/// <summary>
/// 步骤,状态
/// </summary>
public Dictionary < int , int > StepList
{
get { return stepList; }
set { stepList = value; }
}
/// <summary>
/// 是否启用下一个工作流
/// </summary>
private bool isStop = false ;
public bool IsStop
{
get { return isStop; }
set { isStop = value; }
}
/// <summary>
/// 当前的步骤
/// </summary>
private int currentStep = 0 ;
public int CurrentStep
{
get { return (currentStep += 1 ); }
set { currentStep = value; }
}
/// <summary>
/// 设置当前的工作流实现
/// </summary>
/// <param name="s"></param>
public void SetState(State s)
{
current
= s;
}
/// <summary>
/// 操作工作流
/// </summary>
public void DoWork()
{
current.DoWork(
this );
}
}
}

你可能感兴趣的:(状态模式)