模式不是套路(十一):终篇——反模式与断舍离

“模式不是目的,而是手段。当手段成为目的,代码便开始腐烂。” 走完了这趟设计模式的旅程,我们学会了用 Rust 的特性让模式返璞归真。但还有一个更重要的问题:什么时候不该用模式? 这篇终章,我们来聊聊设计模式的阴暗面——过度设计、模式滥用,以及断舍离的智慧。 过度设计的七宗罪 第一罪:未来幻想症 // ❌ 为"可能的需求"做准备 trait PaymentProcessor { fn process(&self, amount: f64) -> Result<(), Error>; fn refund(&self, transaction_id: &str) -> Result<(), Error>; fn partial_refund(&self, transaction_id: &str, amount: f64) -> Result<(), Error>; fn recurring(&self, schedule: &Schedule) -> Result<(), Error>; fn batch_process(&self, payments: Vec<Payment>) -> Result<(), Error>; fn validate_card(&self, card: &Card) -> Result<bool, Error>; fn tokenize(&self, card: &Card) -> Result<Token, Error>; fn dispute(&self, transaction_id: &str, reason: &str) -> Result<(), Error>; // 还有 20 个方法... } // ✅ 只实现当前需要的 trait PaymentProcessor { fn process(&self, amount: f64) -> Result<(), Error>; } // 需要时再扩展 trait RefundablePayment: PaymentProcessor { fn refund(&self, transaction_id: &str) -> Result<(), Error>; } 症状:接口定义了大量"将来可能用到"的方法,但实现者只用其中两三个。 Rust 的解药:trait 组合。需要什么就定义什么,通过 trait 继承和组合按需扩展。 第二罪:抽象层叠床架屋 // ❌ 抽象套抽象 trait Repository<T> { fn save(&self, entity: T) -> Result<(), Error>; } trait UserRepository: Repository<User> { fn find_by_email(&self, email: &str) -> Result<Option<User>, Error>; } trait UserRepositoryFactory { fn create(&self) -> Box<dyn UserRepository>; } trait UserRepositoryFactoryProvider { fn get_factory(&self) -> Box<dyn UserRepositoryFactory>; } // ✅ 直接了当 struct UserRepository { pool: PgPool, } impl UserRepository { pub fn save(&self, user: &User) -> Result<(), Error> { // 直接实现 } pub fn find_by_email(&self, email: &str) -> Result<Option<User>, Error> { // 直接实现 } } 症状:为了"灵活性"层层包装,但整个系统只有一种实现。 ...

December 10, 2025 · 7 min · 1313 words · Nanlong

模式不是套路(十):规则引擎——让业务人员写代码

促销规则天天变,每次改都要发版?解释器模式帮你构建 DSL,让业务人员自己配置规则。从简单条件到复杂表达式,看规则引擎如何炼成。 ...

December 10, 2025 · 12 min · 2504 words · Nanlong

模式不是套路(九):树形世界——递归结构的驯服术

文件系统、组织架构、商品分类、权限树……树形结构无处不在,但处理起来总是一团乱麻。组合、访问者、迭代器、享元四种模式,让你优雅地驯服递归之兽。 ...

December 10, 2025 · 12 min · 2394 words · Nanlong

模式不是套路(八):框架设计——把控制权还给用户

写框架不是写业务代码——你定义骨架,用户填充细节。模板方法和钩子模式,让框架既有约束力又有灵活性,用户用得舒服,你也好维护。 ...

December 10, 2025 · 12 min · 2433 words · Nanlong

模式不是套路(七):外部集成——与第三方和平共处

第三方 SDK 接口丑陋,文档稀烂,还时不时改版?适配器、外观、代理三种模式,帮你在混乱的外部世界和整洁的内部代码之间建起防火墙。 ...

December 10, 2025 · 11 min · 2192 words · Nanlong

模式不是套路(六):事件驱动——模块间的优雅对话

订单模块要通知库存、积分、物流、消息推送……调用链越来越长,模块耦合越来越紧。观察者模式和中介者模式,让模块间的对话从"打电话"变成"发微信"。 ...

December 10, 2025 · 11 min · 2143 words · Nanlong

模式不是套路(五):状态流转——订单不只是 CRUD

订单状态用字符串存,状态转换靠 if-else?当业务规则越来越复杂,这套玩法迟早崩盘。看状态模式、命令模式、备忘录模式如何驯服状态机这头野兽。 ...

December 10, 2025 · 14 min · 2912 words · Nanlong

模式不是套路(四):数据管道——像乐高一样组装逻辑

数据处理逻辑写成一坨,每次改需求都要动主流程?装饰器、责任链、策略三种模式,教你把处理逻辑拆成可组合的积木块。 ...

December 10, 2025 · 12 min · 2467 words · Nanlong

模式不是套路(三):插件架构——让系统长出翅膀

核心功能写死,扩展功能靠改代码?当系统需要支持第三方扩展时,工厂模式和桥接模式就该登场了。看 Rust 如何用 trait 和动态库实现优雅的插件系统。 ...

December 10, 2025 · 12 min · 2361 words · Nanlong

模式不是套路(二):配置系统——从硬编码到热加载

配置文件谁都会写,但写出一个好用的配置系统却不简单。从硬编码到配置文件,从启动加载到热更新,看单例、建造者、原型三种模式如何在配置系统中自然浮现。 ...

December 10, 2025 · 10 min · 2051 words · Nanlong