Rust修仙之道 第十一章 构型境 · 设计模式之道

第十一章:构型境 · 设计模式之道

"千术可构,格局需明;结构得法,道可延年。"

顾行云正式承担"魂核驱动阵"的重构之任,发现需求纷繁、参数繁多、状态变化复杂。传统术式难以胜任,他遂投身于构型殿修行,悟得三种典范设计法术。

一、建造之术 · Builder Pattern

用于灵术属性繁多、创建步骤复杂的情况

症状:构建灵器时参数众多、混乱:

rust 复制代码
let blade = SoulBlade {
    name: String::from("斩灵"),
    element: Some(Element::Fire),
    weight: None,
    enchant_level: Some(3),
};

太难维护,灵力失衡......

Builder 解法:

rust 复制代码
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
    }
}

使用:

rust 复制代码
let blade = SoulBladeBuilder::new("焰牙")
    .element(Element::Fire)
    .enchant_level(2)
    .build();

"构建之术,柔中带钢;既可明确流程,又不扰主结构。"

二、策略之术 · Strategy Pattern

用于行为可变、规则常换的灵法模块

顾行云设计"伤害计算系统",不同灵兽使用不同算法:

rust 复制代码
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 }
}

召唤统一接口:

rust 复制代码
fn apply_damage(s: &dyn DamageStrategy, base: u32) {
    println!("最终伤害:{}", s.calculate(base));
}

"策略可换,接口不改。既统则固,可换则柔。"

三、状态之术 · State Pattern

适用于灵器/咒术状态多变、切换行为不同之术

顾行云构建"法术卷轴",可处于三种状态:未解封、激活中、冷却中

设计如下:

rust 复制代码
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();
    }
}

"术随境迁,道应时通。"

构型心法

术有形者,必有格局;格局清明者,方可纳万变。


⬅️ 上一章            [下一章 待续➡️]