快速学习C# 设计模式之职责链模式
作者:艾心❤ 发布时间:2022-03-28 17:47:45
标签:c#,责任链模式,设计模式
职责链模式简介及UML
职责链也叫责任链,他是一种行为型模式,它为请求创建了一个接收请求者对象的链,并将请求沿着这条链传递到目标对象去处理。
该模式最简单的实现方式就是运用里氏替换原则,对每个职责所持有的对象进行抽象,并使得每个职责对象都拥有共同的父类,通过对外提供出具有一般意义的接口。
范例
该范例,是我在对微服务中,服务发现的容错性进行处理的一种处理方案,考虑到服务发现过程中,如果注册中心宕机,那么可以使用本地文件存放的临时性信息,如果本地文件不存在,那么就直接用内容中存放的信息。在整个流程中,我从注册中心获取服务信息,然后写入到文件中,最终存放到内存。
处理者抽象类
internal abstract class ToleranceHandler
{
protected ToleranceHandler handler;
public void SetToleranceHandler(ToleranceHandler handler)
{
this.handler = handler;
}
public abstract Task<Dictionary<string, List<Service>>> HandlerRequestAsync(int request);
}
服务中心处理
internal class ConsulHandler : ToleranceHandler
{
public override async Task<Dictionary<string, List<Service>>> HandlerRequestAsync(int request)
{
if (request == 2)
{
var result = await this.GetRegisterServiceDictionary();
return result == null ? await this.handler.HandlerRequestAsync(1) : result;
}
else
{
return await this.handler.HandlerRequestAsync(request);
}
}
}
文件处理
internal class FileHandler:ToleranceHandler
{
private static readonly string fileName = "SubscribeService.json";
public override async Task<Dictionary<string, List<Service>>> HandlerRequestAsync(int request)
{
if (request == 0)
{
StreamReader sr = File.OpenText(fileName);
string result = await sr.ReadToEndAsync();
return result.FromJson<Dictionary<string, List<Service>>>();
}
else
{
return await this.handler.HandlerRequestAsync(request);
}
}
}
内存处理
internal class InMemoryHandler : ToleranceHandler
{
public override async Task<Dictionary<string, List<Service>>> HandlerRequestAsync(int request)
{
if (request == 1)
{
IMemoryCache memoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
var result = memoryCache.Get<Dictionary<string, List<Service>>>("ServiceRegisterDiscovery:List");
return result == null ? await this.handler.HandlerRequestAsync(0) : result;
}
return await this.handler.HandlerRequestAsync(request);
}
}
客户端调用
public async Task<List<Service>> GetService(string serviceName)
{
ToleranceHandler consulHandler = new ConsulHandler();
ToleranceHandler fileHandler = new FileHandler();
ToleranceHandler inMemoryHandler = new InMemoryHandler();
consulHandler.SetToleranceHandler(fileHandler);
fileHandler.SetToleranceHandler(inMemoryHandler);
Dictionary<string, List<Service>> serviceDic = await consulHandler.HandlerRequestAsync(2);
return serviceDic[serviceName];
}
客户端调用优缺点
优点:
1、职责链模式将请求的发送者与接收者剥离开来,实现了双方的解耦,而解耦后的最佳效果就是,双方关于自有功能的定制更加简单,修改产生的影响也大大减轻。
2、发送方调用时,无需知道链的结构,只需要设置好链路结构即可。
3、可以利用链路的组合特性,实现职责链组合的配置化,当然需要额外编写控制代码
缺点
1、可能会导致类文件过多,当然也有人说职责链会在一定程度上对系统的性能造成不利影响,不过这条我认为可以忽略,因为从系统维护的角度来说,这点牺牲是允许的。
2、如果编写不注意,极有可能导致循环调用
来源:https://www.cnblogs.com/edison0621/p/10546060.html


猜你喜欢
- 本文实例讲述了C#获取进程或线程相关信息的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.
- 项目要求1.初次打开程序时右上角标题栏显示“无连接”,点击旁边的按钮选择“我的好友”,进入配对界面;2.选择好友之后,返回主界面,标题栏会显
- 工具类-java精确到小数点后6位验证要求,必须精确到小数点后6位,但是后面都是0的话,double会省略0,正则验证不通过,所以有了下面解
- 前言单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”而我对单例的
- java 读取本地文件实例详解用javax.xml、w3c解析实例代码:package cn.com.xinli.monitor.utils
- 1、redis的几种常见客户端:Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持;Redisson:实现了
- 一、前言首选,双轴快排也是一种快排的优化方案,在JDK的Arrays.sort()中被主要使用。所以,掌握快排已经不能够满足我们的需求,我们
- 扩展阅读c#基础系列1---深入理解 值类型和引用类型c#基础系列2---深入理解 String引言在上篇文章深入理解值类型和引用类型的时候
- 前言:在 Java 语言中,并发编程都是依靠线程池完成的,而线程池的创建方式又有很多,但从大的分类来说,线程池的创建总共分为两大类:手动方式
- Swing包的介绍Java基础类数据库(Java Foundation Class)给java应用程序增加了图形界面、丰富的功能性以及与用户
- 一:前言:最近支付后台登录一段时间后如果没有任何操作,总是需要重新登录才可以继续访问页面,出现这个问题的原因就是session超时,debu
- Android 拦截返回键事件的实例详解KeyEvent类Android.View.KeyEvent类中定义了一系列的常量和方法,用来描述A
- 一、树形结构树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树
- 根据UGUI的射线检测机制获取当前鼠标下的UI:/// <summary> /// 获取鼠标停留处UI
- 本文实例为大家分享了android实现手机截屏并保存截图功能的具体代码,供大家参考,具体内容如下一、准备一张图片拷贝screenshot_p
- 一、获取当前时间, 格式为: yyyy-mm-dd hh-mm-ss
- 一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成。除了基于TCP的二进制文件传输,还演示了JAVA Swing的
- Android 7.0系统在运行应用的时候,对权限做了诸多限制,normal, dangerous, signature, signatur
- 本文实例讲述了JavaWeb 网上书店 注册和登陆功能。分享给大家供大家参考,具体如下:工具:Eclipse + Navicat源码地址:h
- 学C#的原因其实挺简单的,因为一直对游戏挺感兴趣,查了下比较流行的游戏引擎Unity的主要开发语言是C#,所以就决定从C#入手,学学面向对象