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

用Rust实现23种设计模式之 职责链模式

关注我,学习Rust不迷路!!

优点

  • 解耦:职责链模式将请求发送者和接收者解耦,使得多个对象都有机会处理请求,而不是将请求的发送者和接收者紧密耦合在一起。
  • 灵活性:可以动态地改变或扩展处理请求的顺序和责任链中的对象。
  • 可维护性:每个处理者只需关注自己的责任,使得代码更易于理解、维护和扩展。

使用场景

  • 当有多个对象可以处理同一个请求,但具体的处理者在运行时才确定时,职责链模式非常有用。
  • 当需要在不明确接收者的情况下,将请求的发送者和接收者解耦时,职责链模式可以提供一种简单而灵活的解决方案。

代码示例

下面是一个简单的例子,演示如何使用 Rust 实现职责链模式。

// 请求结构体
struct Request {content: String,
}// 处理者 trait
trait Handler {fn set_next(&mut self, handler: Box<dyn Handler>);fn handle_request(&self, request: &Request);
}// 具体处理者 A
struct ConcreteHandlerA {next_handler: Option<Box<dyn Handler>>,
}impl Handler for ConcreteHandlerA {fn set_next(&mut self, handler: Box<dyn Handler>) {self.next_handler = Some(handler);}fn handle_request(&self, request: &Request) {if request.content.contains("A") {println!("Handled by ConcreteHandlerA");} else if let Some(ref handler) = self.next_handler {handler.handle_request(request);} else {println!("No handler can handle the request");}}
}// 具体处理者 B
struct ConcreteHandlerB {next_handler: Option<Box<dyn Handler>>,
}impl Handler for ConcreteHandlerB {fn set_next(&mut self, handler: Box<dyn Handler>) {self.next_handler = Some(handler);}fn handle_request(&self, request: &Request) {if request.content.contains("B") {println!("Handled by ConcreteHandlerB");} else if let Some(ref handler) = self.next_handler {handler.handle_request(request);} else {println!("No handler can handle the request");}}
}// 使用示例
fn main() {let mut handler_a = ConcreteHandlerA { next_handler: None };let mut handler_b = ConcreteHandlerB { next_handler: None };handler_a.set_next(Box::new(handler_b));let request_a = Request {content: String::from("Request A"),};handler_a.handle_request(&request_a);let request_b = Request {content: String::from("Request B"),};handler_a.handle_request(&request_b);let request_c = Request {content: String::from("Request C"),};handler_a.handle_request(&request_c);
}

解释说明

  • 首先,我们定义了一个 Request 结构体,代表请求的内容。
  • 然后,我们定义了一个 Handler trait,包含设置下一个处理者和处理请求的方法。
  • 接着,我们实现了两个具体的处理者: ConcreteHandlerAConcreteHandlerB ,它们都实现了 Handler trait 的方法。如果当前处理者可以处理请求,则进行处理;否则,将请求传递给下一个处理者。
  • main 函数中,我们创建了两个具体的处理者对象,并使用 set_next 方法将它们连接成职责链。然后,我们创建了三个不同的请求,并通过第一个处理者来处理它们。

关注我,学习Rust不迷路!!

http://www.lryc.cn/news/109769.html

相关文章:

  • 进销存管理中的技术创新和数字化转型
  • 与“云”共舞,联想凌拓的新科技与新突破
  • 【超细节】Vue3组件事件怎么声明,defineEmits与emit
  • java Selenium 实现简单的网页操作
  • (数据库系统概论|王珊)第一章绪论-第一节:数据库系统概论
  • 深入理解TCP三次握手:连接可靠性与安全风险
  • 基于人工智能的智能矿山解决方案
  • vue-cli3项目优化
  • Windows环境下VSCode安装PlatformIO Cero报错ERROR: HTTP error 403 while getting
  • git bash 安装sdkadmin
  • 如何在IEEE论文中添加伪代码pseudocode
  • 【css】css隐藏元素
  • JUC并发编程(二)ForkJoinPool、Future、CompletableFuture、CAS
  • 大数据课程F2——HIve的安装操作
  • 华为云hcip核心知识笔记(存储服务规划)
  • 四、JVM-对象内存模型
  • 2023-08-05 LeetCode每日一题(合并两个有序链表)
  • 【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十七天 47/50
  • 离散型制造业生产管理云MES系统解决方案
  • 【Vue】全家桶介绍
  • 【雕爷学编程】MicroPython动手做(33)——物联网之天气预报2
  • macOS 虚拟桌面黑屏(转)
  • 查看gz文件 linux zcat file.gz mtx.gz
  • 互联网——根服务器
  • 华为OD机试之报文回路(Java源码)
  • 林大数据结构【2019】
  • 2023华数杯数学建模A题思路分析 - 隔热材料的结构优化控制研究
  • Linux常用命令——dos2unix命令
  • 【NLP pytorch】基于BERT_TextCNN新闻文本分类实战(项目详解)
  • 决策树与随机森林