Rust 的所有权、借用和生命周期机制使得许多经典的面向对象设计模式需要重新思考。以下是 Rust 中常见的设计模式及其惯用实现方式️ 创建型模式1. Builder 模式Rust 中非常常见用于构建复杂对象。#[derive(Default)] struct Request { url: String, method: String, headers: Vec(String, String), } impl Request { fn builder() - RequestBuilder { RequestBuilder::default() } } #[derive(Default)] struct RequestBuilder { url: String, method: String, headers: Vec(String, String), } impl RequestBuilder { fn url(mut self, url: str) - Self { self.url url.to_string(); self } fn method(mut self, method: str) - Self { self.method method.to_string(); self } fn build(self) - Request { Request { url: self.url, method: self.method, headers: self.headers, } } }2. Factory 模式使用enumtrait替代传统的工厂类。trait Shape { fn area(self) - f64; } struct Circle(f64); struct Rectangle(f64, f64); impl Shape for Circle { fn area(self) - f64 { std::f64::consts::PI * self.0 * self.0 } } impl Shape for Rectangle { fn area(self) - f64 { self.0 * self.1 } } enum ShapeKind { Circle(f64), Rectangle(f64, f64), } impl ShapeKind { fn create(self) - Boxdyn Shape { match self { ShapeKind::Circle(r) Box::new(Circle(*r)), ShapeKind::Rectangle(w, h) Box::new(Rectangle(*w, *h)), } } } 结构型模式3. 组合优于继承替代装饰器/适配器Rust 没有继承推荐使用组合 trait实现。trait Renderer { fn render(self) - String; } struct PlainText(String); impl Renderer for PlainText { fn render(self) - String { self.0.clone() } } // 装饰器通过组合包装 struct BoldDecoratorR: Renderer { inner: R, } implR: Renderer Renderer for BoldDecoratorR { fn render(self) - String { format!(b{}/b, self.inner.render()) } }4. Newtype 模式Rust 特有的惯用模式用于给现有类型添加语义或实现外部 trait。struct Meters(f64); struct Seconds(f64); impl Meters { fn per(self, duration: Seconds) - f64 { self.0 / duration.0 } } 行为型模式5. Strategy 模式使用trait 泛型或Boxdyn Trait实现。trait SortStrategy { fn sort(self, data: mut Veci32); } struct QuickSort; struct BubbleSort; impl SortStrategy for QuickSort { fn sort(self, data: mut Veci32) { data.sort(); // 简化 } } impl SortStrategy for BubbleSort { fn sort(self, data: mut Veci32) { // 冒泡排序实现... } } struct SorterS: SortStrategy { strategy: S, } implS: SortStrategy SorterS { fn sort(self, data: mut Veci32) { self.strategy.sort(data); } }6. Observer 模式使用trait 回调或 channel 实现。trait EventListener { fn on_event(self, event: str); } struct EventBus { listeners: VecBoxdyn EventListener, } impl EventBus { fn new() - Self { Self { listeners: vec![] } } fn subscribe(mut self, listener: Boxdyn EventListener) { self.listeners.push(listener); } fn notify(self, event: str) { for listener in self.listeners { listener.on_event(event); } } }7. Iterator 模式Rust 内建了强大的迭代器模式通过实现Iteratortrait。struct Counter { count: usize, max: usize, } impl Counter { fn new(max: usize) - Self { Self { count: 0, max } } } impl Iterator for Counter { type Item usize; fn next(mut self) - OptionSelf::Item { if self.count self.max { self.count 1; Some(self.count) } else { None } } } Rust 特有的惯用模式模式说明RAII资源获取即初始化通过Droptrait 自动释放资源Result/Option替代异常处理强制处理错误和空值impl Trait返回不透明类型简化 API宏用macro_rules!或过程宏实现代码生成类型状态模式用类型系统编码状态机编译期防止非法状态转换类型状态模式示例struct Uninitialized; struct Initialized; struct ConnectionState { _state: std::marker::PhantomDataState, } impl ConnectionUninitialized { fn connect(self) - ConnectionInitialized { println!(连接中...); Connection { _state: std::marker::PhantomData } } } impl ConnectionInitialized { fn send(self, data: str) { println!(发送: {}, data); } } // 编译期保证未初始化的连接不能发送数据 总结Rust 的设计模式核心思想是用类型系统和 trait 替代继承和运行时多态。优先使用组合 trait而非继承善用enum表达有限状态利用泛型实现零成本抽象用Result/Option替代异常用类型状态在编译期消除非法状态如果你想深入了解某个具体模式可以告诉我我可以给出更详细的实现和实际项目中的应用场景