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。