Rust修仙之道 第十一章 构型境 · 设计模式之道
第十一章:构型境 · 设计模式之道
“千术可构,格局需明;结构得法,道可延年。”
顾行云正式承担“魂核驱动阵”的重构之任,发现需求纷繁、参数繁多、状态变化复杂。传统术式难以胜任,他遂投身于构型殿修行,悟得三种典范设计法术。
一、建造之术 · 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修仙之道 第十一章 构型境 · 设计模式之道的更多相关文章
- 从零搭建Golang开发环境--go修仙序章
1. 什么是go语言 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态 .强类型.编译型语言 .Go 语 ...
- 走进shiro,构建安全的应用程序---shiro修仙序章
0. 写在前面 在最近的一个项目当中,我们基于Shiro实现我们系统的认证和授权.借此机会,写几篇博客,总结一下在本次实践当中遇到的问题,和较全面地学习一下Shiro的知识点, 1. 权限管理 权限管 ...
- 第十一章、认识与学习 BASH
第十一章.认识与学习 BASH 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 shell 与 /etc/shel ...
- <构建之法>第十一章、十二章有感
十一章:软件设计与实现 工作时要懂得平衡进度和质量.我一直有一个困扰:像我们团队这次做 男神女神配 社区交友网,我负责主页的设计及内容模块,有个队友负责网站的注册和登录模块,有个队友负责搜索模块,有个 ...
- 第十一章、认识与学习BASH
第十一章.认识与学习 BASH 最近升级日期:2009/08/25 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 ...
- [Effective Java]第十一章 序列化
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 第十一章、特性property
目录 第十一章.特性property 一.property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 二.为什么要用property 三.封装与拓展性 第十一章.特性property ...
- MySQL的修仙者之旅,不来看看你的修为如何吗?
目录 因为我个人比较喜欢看修仙类的小说,所以本文的主体部分借用修仙者的修为等级,将学习旅程划分成:练气.筑基.结丹.元婴.化神.飞升六个段位,你可以看下你大概在哪个段位上哦! 本文目录: 我为什么要写 ...
- CPrimerPlus第十一章中的“选择排序算法”学习
C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解. 举个例子:对数组num[5]={3,5,2,1,4} ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)
第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的 DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...
随机推荐
- 牛客小白月赛104 C-小红打怪
小红打怪 答案有单调性,使用二分答案来做 但是当时没有想到用二分,而是卡在怎么处理这三种攻击了. 可以把进行x回合的攻击,分为先进行x回合的全体打击,再进行x回合的范围打击,最后验证剩余血量够不够x回 ...
- mybatis底层源码
一.运行原理 二.配置文件的解析以及创建SqlSessionFactory 首先通过配置文件的文件流创建SqlSessionFactoryBuilder对象 调用build方法,传入文件流 之后通过解 ...
- 理解.NET Core中的配置Configuration
什么是配置 .NET中的配置,本质上就是key-value键值对,并且key和value都是字符串类型. 在.NET中提供了多种配置提供程序来对不同的配置进行读取.写入.重载等操作,这里我们以为.NE ...
- Python3爬虫批量爬取图片并保存到本地
看新闻的时候忽然发现了一个图片网站,那肯定得爬一下. 网址:https://www.0xu.cn/ 不难发现,qcmn这个路径对应青春美女 右键检查图片地址可见 访问该地址成功访问到了图片 正式开始 ...
- linux系统权限管理
一.认识linux系统的文件权限 首先随便在一个目录下使用ls -l(可简写为ll)指令,就会把该目录下所有的文件和目录的权限显示出来,例如,在根目录下使用ls -l: (深蓝字:目录,白字:文件,浅 ...
- ElementUI默认样式修改
修改ElementUI 样式的几种方式 新建全局样式表 新建 global.css 文件,并在 main.js 中引入. global.css 文件一般都放在 src->assets 静态资源文 ...
- heapdump敏感信息提取工具-JDumpSpider(一) ,附下载链接
介绍 HeapDump敏感信息提取工具 在日常得渗透测试工作中,经常遇到spring actuator未授权漏洞,而且在实际过程中也常常会下载到heapdump这个文件.了解过这个文件的人知道,H ...
- Flutter集成微信小程序技术教程
.markdown-body { color: rgba(89, 89, 89, 1); font-size: 15px; font-family: -apple-system, system-ui, ...
- NCC Mocha v0.2.0 发布, 新增对 Metrics 的支持
目录 项目简介 项目进度 v0.2.0 发布内容 快速体验 数据的发送 数据的查询 Trace 配置 Jaeger 数据源 Trace 数据的查询 Metrics 配置 Prometheus 数据源 ...
- ciscn暨长城杯 广东赛区 ISW阶段应急响应
ciscn暨长城杯 广东赛区 ISW阶段应急响应 题目介绍 小路是一名网络安全网管,据反映发现公司主机上有异常外联信息,据回忆前段时间执行过某些更新脚本(已删除),现在需要协助小路同学进行网络安全应急 ...