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

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

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

一、建造之术 · 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();
}
}

“术随境迁,道应时通。”

构型心法

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


上一章            [下一章 待续️]

Rust修仙之道 第十一章 构型境 · 设计模式之道的更多相关文章

  1. 从零搭建Golang开发环境--go修仙序章

    1. 什么是go语言 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态 .强类型.编译型语言 .Go 语 ...

  2. 走进shiro,构建安全的应用程序---shiro修仙序章

    0. 写在前面 在最近的一个项目当中,我们基于Shiro实现我们系统的认证和授权.借此机会,写几篇博客,总结一下在本次实践当中遇到的问题,和较全面地学习一下Shiro的知识点, 1. 权限管理 权限管 ...

  3. 第十一章、认识与学习 BASH

    第十一章.认识与学习 BASH 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 shell 与 /etc/shel ...

  4. <构建之法>第十一章、十二章有感

    十一章:软件设计与实现 工作时要懂得平衡进度和质量.我一直有一个困扰:像我们团队这次做 男神女神配 社区交友网,我负责主页的设计及内容模块,有个队友负责网站的注册和登录模块,有个队友负责搜索模块,有个 ...

  5. 第十一章、认识与学习BASH

    第十一章.认识与学习 BASH 最近升级日期:2009/08/25 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 ...

  6. [Effective Java]第十一章 序列化

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. 第十一章、特性property

    目录 第十一章.特性property 一.property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 二.为什么要用property 三.封装与拓展性 第十一章.特性property ...

  8. MySQL的修仙者之旅,不来看看你的修为如何吗?

    目录 因为我个人比较喜欢看修仙类的小说,所以本文的主体部分借用修仙者的修为等级,将学习旅程划分成:练气.筑基.结丹.元婴.化神.飞升六个段位,你可以看下你大概在哪个段位上哦! 本文目录: 我为什么要写 ...

  9. CPrimerPlus第十一章中的“选择排序算法”学习

    C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解. 举个例子:对数组num[5]={3,5,2,1,4} ...

  10. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

随机推荐

  1. .net WorkFlow 流程设计

    WikeFlow官网:www.wikesoft.com WikeFlow学习版演示地址:workflow.wikesoft.com WikeFlow学习版源代码下载:https://gitee.com ...

  2. 搭建Trae+Vue3的AI开发环境

    从2024年2025年,不断的有各种AI工具会在自媒体中火起来,号称各种效率王炸,而在AI是否会替代打工人的话题中,程序员又首当其冲. 作为一个后端开发,这篇文章基于Trae工具,来创建和运行一个简单 ...

  3. 校验获取数据或者返回值的方法,should contain的用法

    如上图,验证"首页"是否添加成功,我们就通过验证页面上是否存在"首页"这个关键字,来确认数据是否添加成功 RB的写法如上图,原理是以文本输出"首页&q ...

  4. Git错误,Updates were rejected because the tip of your current branch is behind

    问题:Updates were rejected because the tip of your current branch is behind 在push代码时,遇到这种问题Updates wer ...

  5. 代码随想录第十八天 | Leecode 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

    530. 二叉搜索树的最小绝对差 题目描述 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 差值是一个正数,其数值等于两值之差的绝对值. 示例 1: 输入:roo ...

  6. 【工具】F_Record|和画世界一样录制PS的画画过程的插件(亲测好用)

    亲测日期:2024/04/11 亲测版本:PS 2024 首先, 作者自己制作的使用视频在这里:https://www.bilibili.com/video/BV1bm411Z762 作者的Githu ...

  7. 【MOOC】JS脚本|便于复制粘贴中国大学MOOC网站的测试题和选项

    文章目录 运行结果 完整代码 可复用的部分 1. 删除指定Class或Id的DOM元素 2. 在页面上添加按钮并绑定事件.添加css.class 3. 等待页面加载完成,运行异步函数 4. 选中某个D ...

  8. 实现C++智能指针

    在对象切片一文中,提到可使用充当智能指针的类shape_wrapper,可以简化资源的管理,从根本上消除资源(包括内存)泄漏的可能性,本节来看下如何将shape_wrapper改造成一个完整的智能指针 ...

  9. IPO——LeetCode⑫

    //原题链接https://leetcode.com/problems/ipo/ 题目描述 Suppose LeetCode will start its IPO soon. In order to ...

  10. RabbitMq使用中常见错误--python版

    用python的pika库错误集 一.pika.exceptions.ProbableAuthenticationError: ConnectionClosedByBroker: (403) 'ACC ...