mysql集群怎么实现状态机_用状态模式实现状态机工作流

概述

状态机工作流由一组状态组成。一个状态被指示为初始状态。每个状态都可以接收一组特定事件。视事件而定,可以转换到另一个状态。状态机工作流可以有最终状态。当转换到最终状态时,工作流将完成。

场景

针对我上篇博客设计的一个简单的状态机工作流,流程图如下:

5c148046a626c4ba39e3bff11ab75287.png

我们来设计个用设计模式中的状态模式来设计这个工作流。

设计

先看看它的User Case功能设计:

e9c2883a9ca8463845d2e25167ef066e.png

再看看它的Class diagram设计:

aa92e87e78e44e2a80415231f08a4523.png

实现

先创建Enums class: /********************************************************************************

** Class Name: Enums

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: Enums class

*********************************************************************************/

using System;

namespace WorkFlowCommon

{

public enum ApplicationState

{

None,

Draft,

InProgress,

Complete,

}

public enum WorkFlowState

{

None,

Common,

Manager,

Done,

Refuse

}

[Flags]

public enum ActivityState

{

Create=1,

Edit=2,

Resbmit=4,

Submit=8,

Revoke=16,

Approve=32,

Reject=64,

Read=128,

None=256

}

}

再创建IActivity Interface:

/********************************************************************************

** Class Name: IActivity

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: IActivity interface

*********************************************************************************/

namespace WorkFlowService.IDAL

{

using WorkFlowCommon;

public interface IActivity

{

WorkFlowState Execute(ActivityState activityState);

}

}

再创建IActivityState interface

/********************************************************************************

** Class Name: IActivityState

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: IActivityState interface

*********************************************************************************/

namespace WorkFlowService.IDAL

{

using WorkFlowCommon;

public interface IActivityState

{

ActivityState GetActivityState();

}

}

再创建IStateBase  interface

/********************************************************************************

** Class Name: IStateBase

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: IStateBase interface

*********************************************************************************/

namespace WorkFlowService.IDAL

{

using WorkFlowCommon;

public interface IStateBase : IActivity, IActivityState

{

WorkFlowState GetCurrentState();

}

}

再创建CommonState class

/********************************************************************************

** Class Name: CommonState

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: CommonState class

*********************************************************************************/

namespace WorkFlowService.DAL

{

using WorkFlowCommon;

using IDAL;

public class CommonState : IStateBase

{

public WorkFlowState Execute(ActivityState activityState)

{

if (activityState == ActivityState.Submit || activityState == ActivityState.Resbmit)

return WorkFlowState.Manager;

return WorkFlowState.Common;

}

public WorkFlowState GetCurrentState()

{

return WorkFlowState.Common;

}

public ActivityState GetActivityState()

{

return ActivityState.Submit | ActivityState.Read | ActivityState.Revoke | ActivityState.Resbmit;

}

}

}

再创建DoneState Class

/********************************************************************************

** Class Name: DoneState

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: DoneState class

*********************************************************************************/

namespace WorkFlowService.DAL

{

using WorkFlowCommon;

using IDAL;

public class DoneState : IStateBase

{

public WorkFlowState Execute(ActivityState activityState)

{

return WorkFlowState.Done;

}

public WorkFlowState GetCurrentState()

{

return WorkFlowState.Done;

}

public ActivityState GetActivityState()

{

return ActivityState.Read;

}

}

}

再创建ManageState class

/********************************************************************************

** Class Name: ManageState

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: ManageState class

*********************************************************************************/

namespace WorkFlowService.DAL

{

using WorkFlowCommon;

using IDAL;

public class ManageState : IStateBase

{

public WorkFlowState Execute(ActivityState activityState)

{

if (activityState == ActivityState.Approve)

return WorkFlowState.Done;

if (activityState == ActivityState.Revoke)

return WorkFlowState.Common;

return WorkFlowState.Refuse;

}

public WorkFlowState GetCurrentState()

{

return WorkFlowState.Manager;

}

public ActivityState GetActivityState()

{

return ActivityState.Approve | ActivityState.Reject | ActivityState.Read;

}

}

}

再创建RefuseState class

/********************************************************************************

** Class Name: RefuseState

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: RefuseState class

*********************************************************************************/

namespace WorkFlowService.DAL

{

using WorkFlowCommon;

using IDAL;

public class RefuseState : IStateBase

{

public WorkFlowState Execute(ActivityState activityState)

{

return WorkFlowState.Refuse;

}

public WorkFlowState GetCurrentState()

{

return WorkFlowState.Refuse;

}

public ActivityState GetActivityState()

{

return ActivityState.Read;

}

}

}

再创建StateMapping class:

/********************************************************************************

** Class Name: StateMapping

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: StateMapping class

*********************************************************************************/

namespace WorkFlowService.Help

{

using System.Collections.Generic;

using DAL;

using IDAL;

public class StateMapping

{

public List StateBasesList;

private StateMapping()

{

Init();

}

private static StateMapping _instance;

public static StateMapping Instance

{

get

{

if (_instance == null) _instance = new StateMapping();

return _instance;

}

}

private void Init()

{

StateBasesList = new List

{

new CommonState(),

new ManageState(),

new DoneState(),

new RefuseState()

};

}

}

}

再创建WorkFlowEngine class

/********************************************************************************

** Class Name: WorkFlowEngine

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: WorkFlowEngine class

*********************************************************************************/

namespace WorkFlowService.BLL

{

using WorkFlowCommon;

using DAL;

using Help;

using IDAL;

public class WorkFlowEngine

{

private IStateBase GetCurrentWorkFlowStateByWorkFlowState(WorkFlowState workFlowState)

{

foreach (var iStateBase in StateMapping.Instance.StateBasesList)

{

if (iStateBase.GetCurrentState() == workFlowState) return iStateBase;

}

return new CommonState();

}

public WorkFlowState Execute(WorkFlowState workFlowState,ActivityState activityState)

{

return GetCurrentWorkFlowStateByWorkFlowState(workFlowState).Execute(activityState);

}

public ActivityState GetActivityStateByWorkFlowState(WorkFlowState workFlowState)

{

return GetCurrentWorkFlowStateByWorkFlowState(workFlowState).GetActivityState();

}

}

}

最后创建Nunit Test

/********************************************************************************

** Class Name: TestStateWorkFlowTest

** Author: spring yang

** Create date: 2013-3-13

** Modify: spring yang

** Modify Date: 2012-3-13

** Summary: TestStateWorkFlowTest interface

*********************************************************************************/

namespace TestCommunication.WorkflowService

{

using Common;

using NUnit.Framework;

using WFService;

public class TestStateWorkFlowTest : BaseActivity

{

private WorkFlowServiceClient WfServiceInstance

{

get { return new WorkFlowServiceClient(); }

}

[Test]

public void TestNewWorkflow()

{

var appEntity = new AppInfoModel

{

ActivityState = ActivityState.Submit.ToString(),

AppId = "001",

WorkflowName = "TestStateWorkFlow",

UserId = "001",

CurrentState = "Common"

};

var result = WfServiceInstance.NewWorkFlow(appEntity);

Assert.AreEqual(result, "Manage");

}

[Test]

public void TestManageApproveWorkflow()

{

var appEntity = new AppInfoModel

{

ActivityState = ActivityState.Submit.ToString(),

AppId = "002",

WorkflowName = "TestStateWorkFlow",

UserId = "002",

CurrentState = "Common"

};

var result = WfServiceInstance.NewWorkFlow(appEntity);

Assert.AreEqual(result, "Manage");

var manageEntity = new AppInfoModel

{

ActivityState = ActivityState.Approve.ToString(),

AppId = "002",

WorkflowName = "TestStateWorkFlow",

UserId = "003",

CurrentState = "Manage"

};

var manageResult = WfServiceInstance.Execute(manageEntity);

Assert.AreEqual(manageResult, "Done");

}

[Test]

public void TestManageRejectWorkFlow()

{

var appEntity = new AppInfoModel

{

ActivityState = ActivityState.Submit.ToString(),

AppId = "004",

WorkflowName = "TestStateWorkFlow",

UserId = "004",

CurrentState = "Common"

};

var result = WfServiceInstance.NewWorkFlow(appEntity);

Assert.AreEqual(result, "Manage");

var manageEntity = new AppInfoModel

{

ActivityState = ActivityState.Reject.ToString(),

AppId = "004",

WorkflowName = "TestStateWorkFlow",

UserId = "005",

CurrentState = "Manage"

};

var manageResult = WfServiceInstance.Execute(manageEntity);

Assert.AreEqual(manageResult, "Refuse");

}

[Test]

public void TestSaveWorkflow()

{

var appEntity = new AppInfoModel

{

ActivityState = ActivityState.Save.ToString(),

AppId = "006",

WorkflowName = "TestStateWorkFlow",

UserId = "006",

CurrentState = "Common"

};

var result = WfServiceInstance.NewWorkFlow(appEntity);

Assert.AreEqual(result, "Common");

}

[Test]

public void TestRevokeWorkflow()

{

var appEntity = new AppInfoModel

{

ActivityState = ActivityState.Submit.ToString(),

AppId = "007",

WorkflowName = "TestStateWorkFlow",

UserId = "007",

CurrentState = "Common"

};

var result = WfServiceInstance.NewWorkFlow(appEntity);

Assert.AreEqual(result, "Manage");

var commonEntity = new AppInfoModel

{

ActivityState = ActivityState.Revoke.ToString(),

AppId = "007",

WorkflowName = "TestStateWorkFlow",

UserId = "007",

CurrentState = "Common"

};

var revokeResult = WfServiceInstance.Execute(commonEntity);

Assert.AreEqual(revokeResult, "Common");

}

[Test]

public void TestResubmitWorkflow()

{

var appEntity = new AppInfoModel

{

ActivityState = ActivityState.Submit.ToString(),

AppId = "007",

WorkflowName = "TestStateWorkFlow",

UserId = "007",

CurrentState = "Common"

};

var result = WfServiceInstance.NewWorkFlow(appEntity);

Assert.AreEqual(result, "Manage");

var commonEntity = new AppInfoModel

{

ActivityState = ActivityState.Revoke.ToString(),

AppId = "007",

WorkflowName = "TestStateWorkFlow",

UserId = "007",

CurrentState = "Common"

};

var revokeResult = WfServiceInstance.Execute(commonEntity);

Assert.AreEqual(revokeResult, "Common");

var resubmitEntity = new AppInfoModel

{

ActivityState = ActivityState.Resubmit.ToString(),

AppId = "007",

WorkflowName = "TestStateWorkFlow",

UserId = "007",

CurrentState = "Common"

};

var lastResult = WfServiceInstance.Execute(resubmitEntity);

Assert.AreEqual(lastResult, "Manage");

}

}

}

查看运行的结果:

e302e17f1d5f45a85289681151fed374.png

欢迎各位参与讨论,如果觉得对你有帮助,请点击897a05c16f0462fbd997e610e50c0af8.png推荐下,万分谢谢.

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值