第十一章:构型境 · 设计模式之道
“千术可构,格局需明;结构得法,道可延年。”
顾行云正式承担“魂核驱动阵”的重构之任,发现需求纷繁、参数繁多、状态变化复杂。传统术式难以胜任,他遂投身于构型殿修行,悟得三种典范设计法术。
一、建造之术 · Builder Pattern
用于灵术属性繁多、创建步骤复杂的情况
症状:构建灵器时参数众多、混乱:
- let blade = SoulBlade {
- name: String::from("斩灵"),
- element: Some(Element::Fire),
- weight: None,
- enchant_level: Some(3),
- };
复制代码太难维护,灵力失衡……
Builder 解法:
- struct SoulBlade {
- name: String,
- element: Option<Element>,
- enchant_level: Option<u32>,
- }
- struct SoulBladeBuilder {
- blade: SoulBlade,
- }
- impl SoulBladeBuilder {
- fn new(name: &str) -> Self {
- Self { blade: SoulBlade {
- name: name.to_string(),
- element: None,
- enchant_level: None,
- }}
- }
- fn element(mut self, e: Element) -> Self {
- self.blade.element = Some(e);
- self
- }
- fn enchant_level(mut self, lv: u32) -> Self {
- self.blade.enchant_level = Some(lv);
- self
- }
- fn build(self) -> SoulBlade {
- self.blade
- }
- }
复制代码 使用:- let blade = SoulBladeBuilder::new("焰牙")
- .element(Element::Fire)
- .enchant_level(2)
- .build();
复制代码“构建之术,柔中带钢;既可明确流程,又不扰主结构。”
二、策略之术 · Strategy Pattern
用于行为可变、规则常换的灵法模块
顾行云设计“伤害计算系统”,不同灵兽使用不同算法:- trait DamageStrategy {
- fn calculate(&self, base: u32) -> u32;
- }
- struct FireDamage;
- impl DamageStrategy for FireDamage {
- fn calculate(&self, base: u32) -> u32 { base + 20 }
- }
- struct IceDamage;
- impl DamageStrategy for IceDamage {
- fn calculate(&self, base: u32) -> u32 { base + 10 }
- }
复制代码 召唤统一接口:- fn apply_damage(s: &dyn DamageStrategy, base: u32) {
- println!("最终伤害:{}", s.calculate(base));
- }
复制代码“策略可换,接口不改。既统则固,可换则柔。”
三、状态之术 · State Pattern
适用于灵器/咒术状态多变、切换行为不同之术
顾行云构建“法术卷轴”,可处于三种状态:未解封、激活中、冷却中
设计如下:- trait ScrollState {
- fn use_scroll(&self) -> Box<dyn ScrollState>;
- }
- struct Sealed;
- struct Active;
- struct Cooldown;
- impl ScrollState for Sealed {
- fn use_scroll(&self) -> Box<dyn ScrollState> {
- println!("解封卷轴!");
- Box::new(Active)
- }
- }
- impl ScrollState for Active {
- fn use_scroll(&self) -> Box<dyn ScrollState> {
- println!("施术完成,进入冷却。");
- Box::new(Cooldown)
- }
- }
- impl ScrollState for Cooldown {
- fn use_scroll(&self) -> Box<dyn ScrollState> {
- println!("卷轴冷却中,无法使用。");
- Box::new(Cooldown)
- }
- }
- struct SpellScroll {
- state: Box<dyn ScrollState>,
- }
- impl SpellScroll {
- fn new() -> Self {
- Self { state: Box::new(Sealed) }
- }
- fn activate(&mut self) {
- self.state = self.state.use_scroll();
- }
- }
复制代码“术随境迁,道应时通。”
构型心法
术有形者,必有格局;格局清明者,方可纳万变。
⬅️ 上一章 [下一章 待续➡️]
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |