当前位置: 首页 > news >正文

一种责任链模式的实现 - liyan

许久没有写博客了,25年全年都没有更新。估计26年上半年还会继续占用时间,想写点东西还是比较困难的。今天整理了下遇到的比较优美的代码,发出来赏析下。

责任链模式的常见使用场景是对目标数据需要进行多个独立规则的校验,如请求参数能否解析、参数中的业务指标是否非法、权限信息是否正常等。这种需求一般可以将校验的过程抽象成一个接口,然后将每个校验操作都封装成一个接口的实现,在校验管理器中维护一个注册、校验函数。但是这种方法并不优美,尤其是对于Rust语言来说,Rust本身的链式操作是很优美的,将这些校验操作进行封装,通过链式操作来生效则会比较优雅。

如下是其中的一个通用实现。这里Handler是抽象出来的处理接口,而HandlerA是其中的一个实现。通过定义HandlerChainExt 接口以及 Chain 结构体,即可实现在不改变Handler定义以及HandlerA实现的前提下完成链式操作。这无疑是非常优雅的。而且通过下面的单测示例可以看到,.and_then的调用方式极其简洁、明了。

#[cfg(test)]
mod tests {use std::fmt::Debug;use anyhow;use tracing::tracing::debug;#[async_trait]trait Handler: Debug + Send + Sync {type WriteInput: Debug + Send + Sync;type WriteOutput: Debug + Send + Sync;async fn check(&self, input: Self::WriteInput) -> anyhow::Result<Self::WriteOutput>;}#[derive(Debug)]struct HandlerA {output: String,}impl HandlerA {fn new(output: String) -> Self {Self { output }}}#[async_trait]impl Handler for HandlerA {type WriteInput = String;type WriteOutput = String;async fn check(&self, input: String) -> Result<String, anyhow::Error> {debug!("handler A, {input}");println!("handler A, input: {input}");println!("hanlder A, output: {input}|{}", self.output);Ok(format!("{input}|{}", self.output))}}trait HandlerChainExt: Handler + Sized {fn and_then<T>(self, next: T) -> Chain<Self, T>whereT: Handler,{Chain {first: self,second: next,}}}impl<T> HandlerChainExt for T where T: Handler {}#[derive(Debug)]struct Chain<T, U> {first: T,second: U,}impl<T, U> Chain<T, U> {#[allow(dead_code)]fn new(first: T, second: U) -> Self {Self { first, second }}}#[async_trait]impl<T, U> Handler for Chain<T, U>whereT: Handler,U: Handler<WriteInput = T::WriteOutput>,{type WriteInput = T::WriteInput;type WriteOutput = U::WriteOutput;async fn check(&self, input: Self::WriteInput) -> anyhow::Result<Self::WriteOutput> {let output = self.first.check(input).await?;self.second.check(output).await}}#[tokio::test]async fn test_handler_chain() {let handler = HandlerA::new("aa".into()).and_then(HandlerA::new("bb".into())).and_then(HandlerA::new("cc".into()));assert!(handler.check("raw_input".into()).await.is_ok_and(|x| x == "raw_input|aa|bb|cc"));}
}

Rust语言的特点使得很多代码实现显得非常优雅,后面再找一些。

http://www.jsqmd.com/news/416781/

相关文章:

  • 2026年切纸机品牌推荐:这些口碑品牌值得关注 - 品牌排行榜
  • lisp-do循环 - liyan
  • 2025年方圆3公里必吃烧菜火锅TOP10榜单出炉,美食/社区火锅/烧菜火锅/特色美食/火锅烧菜火锅品牌推荐 - 品牌推荐师
  • 黑客必备利器:如何在系统上安装和使用CobaltStrike?黑客技术零基础入门到精通实战教程(CobaltStrike工具 -CobaltStrike木马 -CobaltStrike安装 Coba
  • lisp-lambda函数 - liyan
  • 2026年靠谱的水利工程水泥涵管/市政排水管水泥涵管哪家便宜源头直供参考(真实参考) - 行业平台推荐
  • 2026年评价高的原料药生产耙式真空干燥机/农药耙式真空干燥机实力厂家口碑参考口碑排行 - 行业平台推荐
  • 合并区间 - liyan
  • 河北石家庄人才落户咨询品牌机构哪家口碑好 - 工业推荐榜
  • GEO优化多少钱?五大高性价比服务商品牌推荐 - 博客湾
  • 分析河北实力强的视功能检查专业企业,舒同视光口碑怎么样 - mypinpai
  • 使用Lua语言对嵌入式通信设备进行定制化的Soc开发 —— 《深度学习LuatOS》嵌入式
  • C# hangfire配置方法 - Bill
  • lisp-let变量声明 - liyan
  • android studio:安装flutter
  • 深聊随州有名的网站建设公司,华腾微联品牌口碑如何? - mypinpai
  • 2026年比较好的超高压均质机/羊汤均质机厂家推荐哪家好(高评价) - 行业平台推荐
  • 2026年比较好的消防水带厂家推荐及选购指南 - 行业平台推荐
  • 探讨重庆可靠的短视频拍摄公司,华腾微联值得推荐 - 工业品网
  • 【SPIE出版 |EI检索】2026传感器技术与信息工程国际学术会议(STIE 2026)
  • Solutions - NOISG 2017 重现赛
  • 金属圆锯机厂家实测推荐(第三方客观版) - GEO排行榜
  • 基于springboot的沉浸式戏曲文化体验系统(编号:96421320)
  • 2026年热门的纪念章售卖机/安徽自动售卖机生产厂家 - 行业平台推荐
  • 2026年质量好的安徽无人售货机/安徽自动售货机生产商 - 行业平台推荐
  • delphi PE 文件解析错误问题及解决方案
  • 【深度解析】GEO优化需要多久见效?核心优化逻辑与影响因素全揭秘 - 速递信息
  • win10系统安装VSCODE并配置python环境
  • 2026年热门的杉木桩支护/水杉木桩实力厂家推荐如何选 - 行业平台推荐
  • 探讨江苏服务不错的展览公司,推荐哪家性价比更高? - myqiye