• C#-设计模式-责任链模式


    1.问题

    现在有一个命令需要层级审批,比如请假,

    如果小于等于3天,那么只需要主管审批通过,

    如果大于3天小于等于7天,则通过后又需要总监审批通过,

    如果大于7天,通过后又需要总经理审批通过。

    这样的业务流程如何实现呢?其实这就是一个典型的责任链模式的应用场景。

    2.定义

    命令的请求要经过多层判断,为了避免客户端和处理程序的耦合作用,将处理程序进行抽象,每个对象持有下一个处理对象的引用,就像是链表一样,一级一级的处理,这样的设计方式就叫做责任链模式。

    3.代码

    public abstract class Response
    {
        protected Response NextResponse;
    
        public abstract void Handle(int dayNum);
    }
    
    public class Director : Response
    {
        public Director()
        {
            NextResponse = new Chief();
        }
    
        public override void Handle(int dayNum)
        {
            Console.WriteLine("主管审批同意");
            if (dayNum > 3)
            {
                NextResponse.Handle(dayNum);
            }
        }
    }
    
    public class Chief : Response
    {
        public Chief()
        {
            NextResponse = new TopManager();
        }
    
        public override void Handle(int dayNum)
        {
            Console.WriteLine("总监审批同意");
            if (dayNum > 7)
            {
                NextResponse.Handle(dayNum);
            }
        }
    }
    
    public class TopManager : Response
    {
        public override void Handle(int dayNum)
        {
            Console.WriteLine("总经理审批同意");
        }
    }

    调用的时候只需要

    Response direct = new Director();
    direct.Handle(5);
    Console.ReadLine();

    4.特点

    如果没有责任链的话,上面这个代码个人会怎么写呢,应该就是if+else不停地判断吧;

    这样虽然没有什么错误,但是一旦判断增加,就不得不修改if语句,而且如果if中的业务逻辑很多的话,也很难维护

    因此,责任链模式经常被用来重构if语句。

    优点:将多个判断逻辑分别封装到了不同的类中,使代码的层次更明确

    缺点:当判断比较多时,会有很多处理类,而且还有性能问题

  • 相关阅读:
    交友app
    xcode5修改APP名字
    xcode5下取消ARC
    五语言学习系列 C,C++,Objective-C,Java,C# (一)历史
    IT领域的罗马帝国——微软公司
    IBOutlet loadView UIButton的subview数量 UIWebView
    UIColor用自定义颜色,TableView去掉背景色
    ORA-00937: not a single-group group function
    向一张表批量插入值
    lsnrctl start 报错
  • 原文地址:https://www.cnblogs.com/gamov/p/10557818.html
Copyright © 2020-2023  润新知