# 责任链模式

属于行为型模式。
避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

优点:

  • 降低耦合度。
  • 简化了对象,使得对象不需要知道链的结构。
  • 增强给对象指派职责的灵活性,可以随时增加或修改处理一个请求的结构。
  • 易扩展。

缺点:

  • 一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理
  • 不正确的配置可能会造成循环调用(死循环)
  • 可能会增加调试的难度

# 类图

img

# 代码

# 处理者抽象类

namespace BehavioralPatterns_ChainOfResponsibilityPattern
{
    /// <summary>
    /// 处理者
    /// </summary>
    public abstract class Handler
    {
        /// <summary>
        /// 继任者
        /// </summary>
        protected Handler Successor;
        /// <summary>
        /// 设置继承者
        /// </summary>
        /// <param name="Successor"></param>
        public void SetSuccessor(Handler Successor)
        {
            this.Successor = Successor;
        }
        /// <summary>
        /// 处理请求
        /// </summary>
        /// <param name="request"> 用于判断当前对象是否会处理请求 & lt;/param>
        /// <param name="action"> 请求的内容 & lt;/param>
        public abstract void Handle(int request, Action action);
    }
}

# 处理者

namespace BehavioralPatterns_ChainOfResponsibilityPattern
{
    public class Handler_0 : Handler
    {
        public override void Handle(int request, Action action)
        {
            if (request < 10)
            {
                action();
                return;
            }
            Successor.Handle(request, action);
        }
    }
}
namespace BehavioralPatterns_ChainOfResponsibilityPattern
{
    public class Handler_1 : Handler
    {
        public override void Handle(int request, Action action)
        {
            if (request >= 10)
            {
                action();
                return;
            }
            Successor.Handle(request, action);
        }
    }
}

# 测试

namespace BehavioralPatterns_ChainOfResponsibilityPattern
{
    public class Program
    {
        private static void Main()
        {
            Handler handler_0 = new Handler_0();
            Handler handler_1 = new Handler_1();
            handler_0.SetSuccessor(handler_1);
            handler_0.Handle(20, () => { Console.WriteLine("Handle"); });
        }
    }
}

运行结果:
Handle