设计模式(十八):责任链模式

一、定义

请求在这个链上传递,直到链上的某一个对象决定处理此请求。

发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

二、实例

其实和状态模式类似,只是状态模式在具体的子类中指定了下一个具体的处理对象。而责任链模式,可以在客户端动态的组织链的规则和责任。

首先,上下文类:

public class Context
    {
        public string Suffix { get; set; }        
    }

其次,抽象责任

 public abstract class BaseHttpModule
    {
        public BaseHttpModule NextHttpModule { get; set; }
        public abstract void Requsest(Context context);
    }

具体实现:

  public class FirstHttpModule : BaseHttpModule
    {
        public override void Requsest(Context context)
        {
            if (context.Suffix == ".aspx")
            {
                Console.WriteLine("文件后缀为:{0}", context.Suffix);
            }
            else if (NextHttpModule != null)
            {
                NextHttpModule.Requsest(context);
            }
        }
    }
 public class LastHttpModule : BaseHttpModule
    {
        public override void Requsest(Context context)
        {
            if (context.Suffix == ".cshtml")
            {
                Console.WriteLine("文件后缀为:{0}", context.Suffix);
            }
            else if (NextHttpModule != null)
            {
                NextHttpModule.Requsest(context);
            }
        }
    }

客户端:

 //------------------------责任链模式----------------------
            Responsibility.Context resquestContext = new Responsibility.Context();
            resquestContext.Suffix = ".cshtml";

            Responsibility.BaseHttpModule aspx = new Responsibility.FirstHttpModule();
            Responsibility.BaseHttpModule cshtml = new Responsibility.LastHttpModule();
            aspx.NextHttpModule = cshtml;

            aspx.Requsest(resquestContext);
            Console.ReadKey();

结果:

三、总结

责任链 可以动态串联责任

状态模式 流程在子类中已经确定。

原文地址:https://www.cnblogs.com/sunchong/p/5148868.html