设计模式应用1--工作流设计
本人比较关注设计模式,今早看到别人一个责任链模式博客。来了点写代码的兴趣。
做了一个简单的工作流申请和处理的流程。干什么事情的呢?就是一个企业想发文嘛!这不是要进过层层审批的嘛!按等级从小到大我定义了员工、人事、经理3个角色。
先晒类关系图
代码:
首先我们创建基础的员工的关系:
Staff 员工
namespace WorkFlow { public class Staff : IStaff { public int Level { get; set; } public string Name { get; set; } public Staff(int level, string name) { Level = level; Name = name; } public virtual void Request(Message message) { } public virtual void Handle(Message message) { } } }
IStaff
namespace WorkFlow { public interface IStaff { int Level { get; set; } string Name { get; set; } void Request(Message message); void Handle(Message message); } }
Employee权限最低的员工
using System; using System.Collections.Generic; namespace WorkFlow { public class Employee : Staff { public Employee() : base(10, "员工") { } public override void Request(Message message) { new MessageDrive( message, this); } public override void Handle(Message message) { Console.WriteLine(this.Name + "处理了" + message.Title + "文件"); } } }
Personnel 人事
Manager 经理
using System; using System.Collections.Generic; namespace WorkFlow { public class Manager : Staff { public Manager() : base(30, "经理") { } public override void Request(Message message) { new MessageDrive( message, this); } public override void Handle(Message message) { Console.WriteLine(this.Name + "处理了" + message.Title + "文件"); } } }
接下来我们进入关键的地方,消息
Message 实体
MessageDrive 消息驱动
using System.Collections.Generic; namespace WorkFlow { public class MessageDrive { public List<IStaff> LevelIStaff { get; set; } public Message Message { get; set; } public IStaff IStaff { get; set; } public MessageDrive( Message message, IStaff requestStaff) { this.Message = message; this.IStaff = requestStaff; Handle(requestStaff); } public void Handle(IStaff requestStaff) { List<IStaff> LevelIStaff = new List<IStaff>(); LevelIStaff.Add(new Employee()); LevelIStaff.Add(new Personnel()); LevelIStaff.Add(new Manager()); int index = LevelIStaff.FindIndex(d => d.Level == requestStaff.Level); requestStaff.Handle(Message); if (index + 1 < LevelIStaff.Count) Handle(LevelIStaff[index + 1]); } } }
如果要实现不同的工作流流转和更高级的功能的定义不同的流程可以通过在MessageDrive的Handle根据IStaff和消息获得不同的流向,现在我简单的Employee-》Personnel-》Manager。
接下来调用
Program客户端调用
using System; namespace WorkFlow { class Program { static void Main(string[] args) { Personnel employee = new Personnel(); employee.Request(new Message() { Title = "《国庆放假一个月通知》", ID = 1 }); Console.ReadLine(); } } }
简单吧!不多说了。
这样以后要是新加一个角色或流程都比较容易扩展。
希望大家来指正
再加下啊!有兴趣可以来 设计模式QQ群:161153385。大家一起改进
这个不知道怎么的有的代码展不开我把源码附上 源码