23_责任链模式

责任链模式是一种行为设计模式,它可以将请求的发送者和接收者解耦,并且允许多个对象都有机会处理请求。

在责任链模式中,每个处理者都持有对下一个处理者的引用,形成一个链条。当请求发出时,从链条的头部开始,每个处理者都有机会处理请求。如果某个处理者能够处理请求,它就会处理请求并结束,否则将请求传递给下一个处理者,直到有一个处理者能够处理请求或者到达链条的末尾。

责任链模式包含以下几个角色:

  1. 抽象处理者(Handler):定义了处理请求的接口,并持有对下一个处理者的引用。

  2. 具体处理者(Concrete Handler):实现了处理请求的方法,并决定是否能够处理请求。

责任链模式的工作流程如下:

  1. 创建具体处理者对象,并确定它们的处理顺序。

  2. 将具体处理者按照顺序连接成一条链。

  3. 发送请求给链条的头部处理者。

  4. 头部处理者根据自己的逻辑判断是否能够处理请求,如果能够处理,则处理请求并结束;如果不能处理,则将请求传递给下一个处理者。

  5. 重复步骤4,直到有一个处理者能够处理请求或者到达链条的末尾。

责任链模式的优点包括:

  1. 解耦了请求的发送者和接收者,使得系统更加灵活和可扩展。

  2. 可以动态地添加、修改和删除处理者,灵活地调整处理链的结构。

  3. 可以避免请求的发送者和接收者之间的耦合,使系统更加符合单一职责原则。

责任链模式适用于以下情况:

  1. 有多个对象可以处理请求,但是不确定哪个对象能够处理请求,或者可以处理请求的对象会随着时间的推移而改变。

  2. 需要在不同的对象之间动态地传递请求。

  3. 需要将请求的发送者和接收者解耦,提高系统的灵活性和可扩展性。

总之,责任链模式是一种将请求的发送者和接收者解耦的设计模式,它可以形成一个处理链条,每个处理者都有机会处理请求。这种模式可以提高系统的灵活性和可扩展性,适用于处理复杂的请求逻辑。

 

案例场景:订单审核,经理,总监,副总裁

/// <summary>
    /// 需要处理的请求,需要审核的订单
    /// 经理<=5000,总监<=10000,副总裁<=50000
    /// </summary>
    public class Order
    {
        public int Id { get; set; }
        public string Name { get; set; }
        /// <summary>
        /// 金额
        /// </summary>
        public int Amount { get; set; }
    }

 

Handler

/// <summary>
    /// 抽象处理器
    /// </summary>
    public abstract class HandlerBase
    {
        /// <summary>
        /// 是否同意
        /// </summary>
        /// <param name="order"></param>
        public abstract void Approve(Order order);

        /// <summary>
        /// 下一个签字人
        /// </summary>
        public HandlerBase NextHandler { get;private  set; }

        /// <summary>
        /// 设置下一个签字人
        /// </summary>
        /// <param name="nextHandler"></param>
        public virtual void SetNextHandler(HandlerBase nextHandler)
        {
            NextHandler = nextHandler;
        }
    }

 

Concrete Handler

/// <summary>
    /// 经理
    /// </summary>
    public class Manager : HandlerBase
    {
        public override void Approve(Order order)
        {
            if(order!=null)
            {
                if(order.Amount<=5000)
                {
                    Console.WriteLine("经理审核成功");
                }
                else
                {
                    if(NextHandler!=null)
                    {
                        NextHandler.Approve(order);
                    }
                    else
                    {
                        Console.WriteLine("审核不存在");
                    }
                }
            }
            else
            {
                throw new Exception("订单不能为空");
            }
        }
    }
/// <summary>
    /// 总监
    /// </summary>
    public class Director : HandlerBase
    {
        public override void Approve(Order order)
        {
            if (order != null)
            {
                if (order.Amount <= 10000)
                {
                    Console.WriteLine("总监审核成功");
                }
                else
                {
                    if (NextHandler != null)
                    {
                        NextHandler.Approve(order);
                    }
                    else
                    {
                        Console.WriteLine("审核不存在");
                    }
                }
            }
            else
            {
                throw new Exception("订单不能为空");
            }
        }
    }
/// <summary>
    /// 副总裁
    /// </summary>
    public class VicePresident : HandlerBase
    {
        public override void Approve(Order order)
        {
            if (order != null)
            {
                if (order.Amount <= 50000)
                {
                    Console.WriteLine("副总裁审核成功");
                }
                else
                {
                    Console.WriteLine("CEO审核");
                }
            }
            else
            {
                throw new Exception("订单不能为空");
            }
        }
    }

调用

internal class Client
    {
        public void Start()
        {
            HandlerBase manager = new Manager();
            HandlerBase director=new Director();
            HandlerBase vicePresident= new VicePresident();

            manager.SetNextHandler(director);
            director.SetNextHandler(vicePresident);

            Order order = new Order()
            {
                Id = 1,
                Name = "张三",
                Amount = 52000
            };
            manager.Approve(order);
        }
    }
static void Main(string[] args)
        {
            new Client().Start();
            Console.ReadKey();
            Console.WriteLine("Hello, World!");
        }

 

 

 

 

posted @ 2024-03-17 10:23  野码  阅读(5)  评论(0编辑  收藏  举报