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

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

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

一、建造之术 · 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. 牛客小白月赛104 C-小红打怪

    小红打怪 答案有单调性,使用二分答案来做 但是当时没有想到用二分,而是卡在怎么处理这三种攻击了. 可以把进行x回合的攻击,分为先进行x回合的全体打击,再进行x回合的范围打击,最后验证剩余血量够不够x回 ...

  2. mybatis底层源码

    一.运行原理 二.配置文件的解析以及创建SqlSessionFactory 首先通过配置文件的文件流创建SqlSessionFactoryBuilder对象 调用build方法,传入文件流 之后通过解 ...

  3. 理解.NET Core中的配置Configuration

    什么是配置 .NET中的配置,本质上就是key-value键值对,并且key和value都是字符串类型. 在.NET中提供了多种配置提供程序来对不同的配置进行读取.写入.重载等操作,这里我们以为.NE ...

  4. Python3爬虫批量爬取图片并保存到本地

    看新闻的时候忽然发现了一个图片网站,那肯定得爬一下. 网址:https://www.0xu.cn/ 不难发现,qcmn这个路径对应青春美女 右键检查图片地址可见 访问该地址成功访问到了图片 正式开始 ...

  5. linux系统权限管理

    一.认识linux系统的文件权限 首先随便在一个目录下使用ls -l(可简写为ll)指令,就会把该目录下所有的文件和目录的权限显示出来,例如,在根目录下使用ls -l: (深蓝字:目录,白字:文件,浅 ...

  6. ElementUI默认样式修改

    修改ElementUI 样式的几种方式 新建全局样式表 新建 global.css 文件,并在 main.js 中引入. global.css 文件一般都放在 src->assets 静态资源文 ...

  7. heapdump敏感信息提取工具-JDumpSpider(一) ,附下载链接

    ​ 介绍 HeapDump敏感信息提取工具 在日常得渗透测试工作中,经常遇到spring actuator未授权漏洞,而且在实际过程中也常常会下载到heapdump这个文件.了解过这个文件的人知道,H ...

  8. Flutter集成微信小程序技术教程

    .markdown-body { color: rgba(89, 89, 89, 1); font-size: 15px; font-family: -apple-system, system-ui, ...

  9. NCC Mocha v0.2.0 发布, 新增对 Metrics 的支持

    目录 项目简介 项目进度 v0.2.0 发布内容 快速体验 数据的发送 数据的查询 Trace 配置 Jaeger 数据源 Trace 数据的查询 Metrics 配置 Prometheus 数据源 ...

  10. ciscn暨长城杯 广东赛区 ISW阶段应急响应

    ciscn暨长城杯 广东赛区 ISW阶段应急响应 题目介绍 小路是一名网络安全网管,据反映发现公司主机上有异常外联信息,据回忆前段时间执行过某些更新脚本(已删除),现在需要协助小路同学进行网络安全应急 ...