当前位置: 首页 > article >正文

【Rust中的策略模式实现】

Rust中的策略模式实现

  • 前言
  • Rust代码示例
  • 总结


前言

策略模式就是针对不同的需求使用不同的策略。具体的实例如在生成报告时,需要不同的格式,如json,html等等,出发点是一样的,开发者的需求导向是结果报告,而具体的,策略就是不同的报告格式。抽象成代码实现思路就是,开发者需要定义一个统一的接口(在rust中是trait),在使用者调用时触发,而针对不同的格式,开发者需要定义不同的实现,也就是针对接口实现不同的代码。在调用时,调用方需要直到不同实现之间的区别,但是无需关注具体的实现,如同集成测试一般,拿到结果即可。


Rust代码示例

use std::collections::HashMap;

type Data = HashMap<String, u32>;

//为了输出不同格式的报告的“接口定义”
trait Formatter {
    fn format(&self, data: &Data, buf: &mut String);
}

struct Statement;
//调用入口,将类型传进去,内部调用format,根据类型的format实现从而将结果输出给buffer s
impl Statement {
    fn generate<T: Formatter>(g: T, s: &mut String) {
        // 这里实际用途中,会是调用具体的获取数据的方法或者在内部直接取到某些需要格式化的数据,
        //这里为了方便就使用了Hashmap直接的表示
        let mut data = HashMap::new();
        data.insert("key1".to_string(), 1);
        data.insert("key2".to_string(), 2);
        // generate report
        g.format(&data, s);
    }
}
//html 格式报告示意
struct Html;
impl Formatter for Html {
    fn format(&self, data: &Data, buf: &mut String) {
        for (k, v) in data {
            let entry = format!("<br>{} {}<br>", k, v);
            buf.push_str(&entry);
        }
    }
}
//json格式报告示意
struct Json;
impl Formatter for Json {
    fn format(&self, data: &Data, buf: &mut String) {
        buf.push('[');
        for (k, v) in data.into_iter() {
            let entry = format!(r#"{{"{}":"{}"}}"#, k, v);
            buf.push_str(&entry);
            buf.push(',');
        }
        buf.pop();
        buf.push(']');
    }
}

fn main() {
    let mut s = String::from("");
    Statement::generate(Html, &mut s);

    println!("{}", s);
    s.clear();
    println!("{}", s);

    Statement::generate(Json, &mut s);
    println!("{}", s);
}


总结

设计模式一般仅在需要的时候使用而不是在项目中满天飞,徒增阅读难度,尤其是在服务器架构下,我们依托服务器自己的架构再通过对业务的理解也能让代码表现得更加简洁和有设计。

“学而时习”


http://www.kler.cn/a/399234.html

相关文章:

  • Sql进阶:字段中包含CSV,如何通过Sql解析CSV成多行多列?
  • Flutter中的Material Theme完全指南:从入门到实战
  • 【C++派生类新增对象的初始化顺序】单继承下派生类新增成员对象的初始化顺序
  • 动手学深度学习73 课程总结和进阶学习
  • 在 Node.js 中解决极验验证码:使用 Puppeteer 自动化
  • 数据研发基础 | 什么是流批一体
  • 10款PDF合并工具的使用体验与推荐!!!
  • 【Redis】使用redis实现登录校验功能
  • vim配置 --> 在创建的普通用户下
  • linux,一、部署LNMP环境二、配置动静分离三、地址重写四、编写systemd Unit文件
  • Azure pipeline 通过git命令修改文件
  • 记录配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的问题(详细说明防止忘记)
  • 【Python刷题】最少拐弯路线问题
  • 实战:深入探讨 MySQL 和 SQL Server 全文索引的使用及其弊端
  • 从北美火到中国,大数据洞察品牌“STANLEY”的突围之路
  • Java基础-I/O流
  • 了解什么是Python(简介)
  • ES6笔记
  • 38配置管理工具(如Ansible、Puppet、Chef)
  • ssm114基于SSM框架的网上拍卖系统的设计与实现+vue(论文+源码)_kaic
  • 两种鼠标hover切换对应图片方法对比
  • Linux下编译MFEM
  • 基于YOLOv8深度学习的智慧课堂学生专注度检测系统(PyQt5界面+数据集+训练代码)
  • Prometheus面试内容整理-Alertmanager
  • C++: string(二)
  • ReactPress与WordPress:一场内容管理系统的较量