设为首页 加入收藏

TOP

设计模式-责任链设计模式(一)
2019-09-20 11:46:06 】 浏览:100
Tags:设计模式 责任

责任链设计模式,是行为型设计模式的巅峰之作。

现在有一个场景,请假申请。请假时间的长短,需要不同级别的领导才能审批。

万物皆对象嘛,请假需要工号、姓名、原因、时长、结果等等,那我们来定义一个请假的类。其实其就是一个上下文环境(Context),保存业务处理中参数-----中间结果-----最终结果。行为型设计模式重用的标配,把行为转移。

public class ApplyContext
{
    public int Id { get; set; }
    public string Name { get; set; }
    /// <summary>
    /// 请假时长
    /// </summary>
    public int Hour { get; set; }
    public string Description { get; set; }
    public bool AuditResult { get; set; }
    public string AuditRemark { get; set; }
}

请假需要new一个实例:

 ApplyContext context = new ApplyContext()
 {
     Id = 506,
     Name = "bingle",
     Hour = 100,
     Description = "世界那么大,我想去看看!",
     AuditResult = false,
     AuditRemark = ""
 };

第一种方式,审批逻辑都卸载上端,直接就是需求翻译,没有任何加工,谈不上什么扩展,面向国产:

 if (context.Hour <= 8)
 {
     Console.WriteLine("PM审批通过");
 }
 else if (context.Hour <= 16)
 {
     Console.WriteLine("主管审批通过");
 }
 else
 {
     Console.WriteLine("************");
 }

第二种方式,面向对象:封装--继承--多态,转移业务逻辑,也只是一个翻译机,翻译完+面向对象,其实完全没有涉及加工没有思考。

领导类S:

 public class PM
 {
     public override void Audit(ApplyContext context)
     {
         Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit");
         if (context.Hour <= 8)
         {
             context.AuditResult = true;
             context.AuditRemark = "允许请假!";
         }
     }   
}


 public class Charge
 {
     public override void Audit(ApplyContext context)
     {
         Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit");
         if (context.Hour <= 16)
         {
             context.AuditResult = true;
             context.AuditRemark = "允许请假!";
         }
    }
}


 public class Manager 
 {
     public override void Audit(ApplyContext context)
     {
         Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit");
         if (context.Hour <= 24)
         {
             context.AuditResult = true;
             context.AuditRemark = "允许请假!";
         }
    }
}


 public class Chief
 {
     public override void Audit(ApplyContext context)
     {
         Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit");
         if (context.Hour <= 48)
         {
             context.AuditResult = true;
             context.AuditRemark = "允许请假!";
         }
    }
}



 public class CEO : AbstractAuditor
 {
     public override void Audit(ApplyContext context)
     {
         Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit");
         if (context.Hour <= 96)
         {
             context.AuditResult = true;
             context.AuditRemark = "允许请假!";
         }
    }
}


public class ChiarMan : AbstractAuditor
{
    public override void Audit(ApplyContext context)
    {
        Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit");
        if (context.Hour <= 1000000)
        {
            context.AuditResult = true;
            context.AuditRemark = "允许请假!";
        }
    }
}
View Code

下面进行逻辑的翻译:

 AbstractAuditor pm = new PM()
 {
     Name = "bingle1"
 };
 pm.Audit(context);
 if (!context.AuditResult)
 {
     AbstractAuditor charge = new Charge()
     {
         Name = "bingle2"
     };
     charge.Audit(context);
     if (!context.AuditResult)
     {
         AbstractAuditor manager = new Manager()
         {
             Name = "bingle3"
         };
         manager.Audit(context);
         if (!context.AuditResult)
         {
             //找下一环节
         }
     }
 }

不要直接翻译的逻辑,需要涉及,现在的场景分析是,1、权限范围内,审批通过;2、权限范围外,交给下一环节审批,写的代码又多了一个,指定洗衣环节,甩锅大法开始。

首先定义一个抽象父类

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇获取支付宝授权用户信息 下一篇表达式树的说明与运用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目