设计模式应用1--工作流设计

  本人比较关注设计模式,今早看到别人一个责任链模式博客。来了点写代码的兴趣。

  做了一个简单的工作流申请和处理的流程。干什么事情的呢?就是一个企业想发文嘛!这不是要进过层层审批的嘛!按等级从小到大我定义了员工、人事、经理3个角色。

  先晒类关系图

《设计模式应用1--工作流设计》

代码:

首先我们创建基础的员工的关系:

《设计模式应用1--工作流设计》
《设计模式应用1--工作流设计》
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)
        {

        }
    }
}

《设计模式应用1--工作流设计》
《设计模式应用1--工作流设计》
IStaff

namespace WorkFlow
{
    public interface IStaff
    {
        int Level { get; set; }
        string Name { get; set; }
        void Request(Message message);
        void Handle(Message message);
    }
}

《设计模式应用1--工作流设计》
《设计模式应用1--工作流设计》
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 + "文件");
        }
    }
}

《设计模式应用1--工作流设计》
《设计模式应用1--工作流设计》
Personnel 人事
《设计模式应用1--工作流设计》
《设计模式应用1--工作流设计》
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 + "文件");
        }
    }
}

 

接下来我们进入关键的地方,消息

《设计模式应用1--工作流设计》
《设计模式应用1--工作流设计》
Message 实体
《设计模式应用1--工作流设计》
《设计模式应用1--工作流设计》
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。

接下来调用

《设计模式应用1--工作流设计》
《设计模式应用1--工作流设计》
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。大家一起改进

这个不知道怎么的有的代码展不开我把源码附上 源码

    原文作者:设计模式
    原文地址: http://www.cnblogs.com/vaittr/archive/2012/08/30/2663656.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞