楼层: 首页/ 软件技术/ Rust 语言基础/ 面向对象与设计模式:Rust 怎么玩
14

面向对象与设计模式:Rust 怎么玩

OOP in Rust · Design Patterns · Newtype

Rust 不是传统 OOP 语言(没有 class、没有继承),但用 struct + trait + 组合 能把 OOP 的所有能力都凑出来。

封装、继承、多态在 Rust 里

OOP 概念Rust 的做法
封装字段默认私有,需要才 pub,配 getter/setter
继承没有。用 trait 默认实现 + 组合替代,官方口号"组合优于继承"
多态泛型单态化(静态分发,快)或 dyn Trait(动态分发,灵活)

常用设计模式的 Rust 写法

  • 策略模式:用 trait 定义可替换算法,传 &dyn Strategy。
  • 建造者模式 Builder:链式方法一路 set,最后 .build() 产出对象,最经典如 reqwest::Client。
  • 状态模式:用枚举把状态编码进类型,非法状态根本构造不出来(类型状态模式)。
  • 观察者模式:trait Observer + Vec<Box<dyn Observer>>。
  • 单例:OnceLock::new() / static 懒加载。

newtype 模式:给类型穿马甲

// newtype:把别人的类型包一层,变成新类型 struct Meters(i32); struct Feet(i32); fn print_len(m: Meters) { println!("{} 米", m.0); } fn main() { let distance = Meters(100); print_len(distance); // print_len(Feet(300)); // 编译错误!类型不同,防呆 }
$ cargo run 100 米

newtype 一箭三雕:① 类型安全(米和英尺不会搞混);② 封装内部;③ 绕过孤儿规则——你可以给 Meters(你自己的类型)实现任何外部 trait。