.net简单的审批责任链模式学习

昨天学习责任链模式的教学视频,今天尝试着一个关于审批的责任链模式练习,做一个学习总结!

首先就是审批的抽象类,具体的审批等级继承于该抽象类。

抽象类:

//审批抽象类
public abstract class BaseApproval
{
    public string Name { get; set; }

    public BaseApproval _NextAudit = null;
    public void SetNext(BaseApproval approval)
    {
        _NextAudit = approval;
    }
    public abstract void Audit(ApplyContext context);

    public void NextAudit(ApplyContext context)
    {
        if (this._NextAudit != null)
        {
            this._NextAudit.Audit(context);
        }
    }
}


项目经理:

/// <summary>
/// 项目经理
/// </summary>
public class ProjectManagers : BaseApproval
{
    public override void Audit(ApplyContext context)
    {
        Console.WriteLine("这里是项目经理{0}审批", this.Name);
        if (context.Hour <= 24)
        {
            Console.WriteLine("项目经理{0}审批成功", this.Name);
            context.AuditStatus = true;
        }
        else
        {
            Console.WriteLine("已经超出项目经理的权限范围,已往上递交");
            base.NextAudit(context);
        }
    }
}


主管:

/// <summary>
/// 主管
/// </summary>
public class Charge : BaseApproval
{
    public override void Audit(ApplyContext context)
    {
        Console.WriteLine("这里是主管{0}审批", this.Name);
        if (context.Hour <= 48)
        {
            Console.WriteLine("项目主管{0}审批成功", this.Name);
            context.AuditStatus = true;
        }
        else
        {
            Console.WriteLine("已经超出主管的权限范围,已往上递交");
            base.NextAudit(context);
        }
    }
}


项目总监:

/// <summary>
/// 项目总监
/// </summary>
public class ProjectDirector : BaseApproval
{
    public override void Audit(ApplyContext context)
    {
        Console.WriteLine("这里是项目总监{0}审批", this.Name);
        if (context.Hour <= 72)
        {
            Console.WriteLine("项目总监{0}审批成功", this.Name);
            context.AuditStatus = true;
        }
        else
        {
            Console.WriteLine("已经超出项目总监的权限范围,已往上递交");
            base.NextAudit(context);
        }
    }
}


然后就是审批申请实现:

class Program
{
    static void Main(string[] args)
    {
        //审批申请
        ApplyContext context = new ApplyContext
        {
            Id = "10000",
            Name = "小明",
            Hour = 72
        };
        //项目经理
        BaseApproval pm = new ProjectManagers
        {
            Name = "张三"
        };
        //主管
        BaseApproval charge = new Charge
        {
            Name = "李四"
        };
        //项目总监
        BaseApproval director = new ProjectDirector
        {
            Name = "王五"
        };
        pm.SetNext(charge);
        charge.SetNext(director);
        pm.Audit(context);
        if (context.AuditStatus)
        {
            Console.WriteLine("请假成功");
        }
        else
        {
            Console.WriteLine("请假失败");
        }
        Console.ReadLine();
    }
}


运行效果:

总结:

责任链模式与状态模式相比,责任链模式中的各个对象并不指定其下一个处理的对象到底是谁,只有在客户端才设定某个类型的链条,请求发出后穿越链条,直到被某个职责类处理或者链条结束。设计思路是把各个业务逻辑判断封装到不同职责类,且携带下一个职责的对应引用,但不像状态模式那样需要明确知道这个引用指向谁,而是在环境类设置链接方式或者过程。使用时,向链的第一个子类的执行方法传递参数就可以。客户端去通过环境类调用责任链,全自动运转起来。

责任链与一般的对象封装相比更加的灵活,可以自由的对审批流程进行控制。当然并不是所有的情况都适合用这个模式,使用哪种模式需要视情况而定。


版权声明:若无特殊注明,本文为《奕独客》原创,转载请保留文章出处。
本文链接:.net简单的审批责任链模式学习 [https://www.yiduk.com/学习分享/13.html]
正文到此结束

热门推荐