快速学习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
0
投稿
猜你喜欢
- 本文实例为大家分享了Android实现图片设置圆角形式的具体代码,供大家参考,具体内容如下1.自定义的图片圆角形式CircleImageVi
- 注释介绍@Cacheable@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存@Cacheable 作用
- 前言关于ThreadLocal (线程本地存储),从字面意思上看主要是存储一些本地变量,使它们能在一个线程内共用,与其他的线程进行数据隔离,
- 前言MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手
- 最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了
- 1、一个示例回顾Future一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度。JDK5新增了Future接口,用于描述一个异步计
- 问题:Information:java: Errors occurred while compiling module &lsquo
- 什么是异步?为什么要用它?异步编程提供了一个非阻塞的,事件驱动的编程模型。 这种编程模型利用系统中多核执行任务来提供并行,因此提供了应用的吞
- 排查@CacheEvict注解失效我简单看了一下《Spring实战》中的demo,然后就应用到业务代码中了,本以为如此简单的事情,竟然在代码
- 前导:发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实
- 若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的。 通常情况下, 静
- md5 属于hash算法一类,是不可逆的消息摘要算法。与对称加密和非对称加密算法不一样,不需要加密密钥。注意:md5不是加密算法,只是将数据
- 每一个基于java的应用程序都有一个共同工作来展示给用户看到的内容作为工作的应用几个对象。当编写一个复杂的Java应用程序,应用程序类应该尽
- servlet实现文件上传,预览,下载和删除,供大家参考,具体内容如下一、准备工作:1.1 文件上传插件:uploadify;1.2 文件上
- 介绍Java命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使不同的请求可以进行参数化,并支持请
- 1、Java版package com.lyz.utils.common; import java.io.UnsupportedEncodin
- 1、数组理论基础数组是存放在连续内存空间上的相同类型数据的集合,可以通过下标索引的方式获取到下标下对应的数据。举个栗子(字符数组)~可以看到
- springboot项目没有mainClass实现打包运行项目分为两个部分,一个是业务代码模块,一个是框架模块,运行class放在框架部分,
- 一、spring定时任务执行两次问题重现和解析最近使用quartz定时任务框架,结果发现开发环境执行无任何问题,部署到服务器上后,发现同一时
- 本文实例为大家分享了Java实现FTP上传与下载的具体代码,供大家参考,具体内容如下JAVA操作FTP服务器,只需要创建一个FTPClien