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

一、定义

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

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

二、实例

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

首先,上下文类:

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();
复制代码

结果:

三、总结

责任链 可以动态串联责任

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

posted @   K战神  阅读(392)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示