我们在日常接触到的一些软件界面,往往喜欢深入分析其实现机理,通过学习、分析,可以提高我们对软件架构的分析能力,从而实现更加弹性、可重用的模块。在无意间,看到一个短信模块的设计,模板里面可以包含了很多变量,从而引发我对其深入分析的兴趣,本文主要介绍我对这些实现的一些理解,介绍一个包含动态变量的短信模板的设计分析。

1、短信模板的效果介绍

如下图所示,上面包含了短信模板的列表信息,以及对具体模板的内容设计,可以在其中插入变量的处理。

如果是硬编码对个别的实现应该很容易,如果我们考虑可扩展性、重用性等因素,需要进行弹性的设计,那么就需要寻找好的思路来动态处理这些变量了。

如它的每个模板的变量都是可以不同的,如其中一个模板有如下变量可以插入到模板内容里面,变量本身用左右的括弧{}进行标识,还是很有规律的。

2、短信模板的设计分析

由于模板是针对某个企业的,企业可能根据需要进行一定的调整,模板可以恢复为最初的版本,因此我们可以考虑设计两个部分,一个部分是基础模板,一个部分是对企业的消息模板,前者不变,后者可以根据需要修改,如无修改保存的,则采用对应的基础模板,也就是模板的模板了。

由于模板是包含有不同变量的,因此我们需要在设计的时候,动态解析这些变量。我们如果能够把传入的对象动态获取它的属性,并给对应的变量赋值,应该就可以实现这个功能。

那么我们就需要通过反射方式,动态获取对应object对象的各种属性名称和值了,这个处理操作如下所示。

        /// <summary>/// 把object对象的属性反射获取到字典列表中/// </summary>/// <param name="data">object对象</param>/// <returns></returns>public static Dictionary<string, string> GetProperties(object data){Dictionary<string, string> dict = new Dictionary<string, string>();Type type = data.GetType();string[] propertyNames = type.GetProperties().Select(p => p.Name).ToArray();foreach (var prop in propertyNames){object propValue = type.GetProperty(prop).GetValue(data, null);string value = (propValue != null) ? propValue.ToString() : "";if(!dict.ContainsKey(prop)){dict.Add(prop, value);}}return dict;}    

前面介绍了,模板的内容,是包含有左右括弧{}的变量的,因此我们可以通过正则表达式,把它们提取出来备用,这样我们就可以把前面反射对应属性的值赋值给模板内容,从而形成新的待发送的具体消息了。

            var regex = @"\{(?<name>.*?)\}";List<string> itemList = GetList(template, regex, "name");

其中GetList就是一个正则表达式获取对应正则内容的函数,函数代码如下所示。

        /// <summary>/// 多个匹配内容/// </summary>/// <param name="sInput">输入内容</param>/// <param name="sRegex">表达式字符串</param>/// <param name="sGroupName">分组名, ""代表不分组</param>public static List<string> GetList(string sInput, string sRegex, string sGroupName){List<string> list = new List<string>();Regex re = new Regex(sRegex, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);MatchCollection mcs = re.Matches(sInput);foreach (Match mc in mcs){if (sGroupName != ""){list.Add(mc.Groups[sGroupName].Value);}else{list.Add(mc.Value);}}return list;}

最后我们可以把内容对应上,给模板替换为最新的属性值了。

        private void button1_Click(object sender, EventArgs e){//模板文本var template = "姓名 = {姓名}, 性别 = {性别}, 卡号 = {卡号}, 公司 = {公司}";//数据对象var data = new { 姓名 = "伍华聪", 性别 = "男", 卡号 = "10000", 公司 = "广州爱奇迪软件科技有限公司" };ReplaceTemplate(template, data);}private void ReplaceTemplate(string template, object data){var regex = @"\{(?<name>.*?)\}";List<string> itemList = GetList(template, regex, "name");Console.WriteLine("列出模板变量对象:");foreach(string item in itemList){Console.WriteLine(item);}Dictionary<string, string> dict = GetProperties(data);foreach(string item in itemList){//如果属性存在,则替换模板,并修改模板值if(dict.ContainsKey(item)){template = Replace(template, regex, dict.Values.ToList());//替换第一个
                }}Console.WriteLine(template);}

测试上面的代码,我们注意到我们的对象是动态构建的,也就是使用匿名类的方式构建一个类,包含有对应的属性值,把这个给模板进行解析,从而赋值形成真正的消息内容的。

var data = new { 姓名 = "伍华聪", 性别 = "男", 卡号 = "10000", 公司 = "广州爱奇迪软件科技有限公司" };

测试案例,我们可以得到的消息,如下所示。

我们从上面截图可以看到,真正的消息已经正确得到,这些是替换具体的模板内容形成的,如果我们在整体的模板设计里面,采用这个思路,就可以实现动态的模板消息发送,从而实现了比较弹性化的设计处理。

本文只是对模板变量这种场景进行了分析,我们在实际项目中,可以更加完善,实现更加强大的模板消息处理,以及利用微信模板消息进行一起发送,实现短信、微信,甚至邮件的同步通知,给客户更好的体验。

以上是微信的模板消息介绍,我们也可以结合动态变量,把对应模板消息替换为我们要发送的消息,从而也实现了微信消息的动态发送。

本文转自博客园伍华聪的博客,原文链接:一个包含动态变量的短信模板设计分析,如需转载请自行联系原博主。

一个包含动态变量的短信模板设计分析相关推荐

  1. 老许,免费分享一个python短信接口,包含200条短信,你要不要?

    今天给大家分享一个免费的python短信接口.可以用于短信注册.登录.密码找回.短信通知等场景. 使用方法如下: 1.下载资源包,按照文档申请签名和模板,就可以看到200条短信额度了 2.在代码中填写 ...

  2. android短信模板,短信服务 · Android – Bmob后端云

    短信服务 Android 开发文档¶ 除了与用户相关的包括一键注册,手机号码登录等操作外,Bmob 还推出了单独的短信验证码服务. 在实际的应用中,开发者希望能够通过短信验证的方式来与用户进行某些重要 ...

  3. 面试通知短信模板大全

    面试通知短信应用场景 平台提供丰富的面试通知短信模板,并支持自定义个性化短信内容,满足企业多场景的应用需求 [XX文化馆]您好!您报考的XX会计岗已进入资格复审阶段,现将相关事项通知如下: [XX酒店 ...

  4. 使用Spring获取JavaBean的属性值匹配短信模板

    2019独角兽企业重金招聘Python工程师标准>>> 在做电信的项目过程中,遇到根据可配置的短信模板去适配相应的短信的内容. Spring的源码提供了解析object对象的属性方法 ...

  5. Nokia NBU备份文件查看工具(包含联系人和短信)

    (zz)Nokia NBU备份文件查看工具(包含联系人和短信) 原作者:秋天 链接 http://wap.cfresh.net/index-wap2.php?p=802 手头现在用的手机仍然是07年入 ...

  6. 行业短信应用的类型与短信模板

    短信应用平台多年的运营中可以看出促销也是要有技巧的,即使是送礼品或者发短信最好跟会员等级挂钩.这样才能突显老会员在店铺中的一个地位,让客户有被尊重的感觉,且根据不同类型的顾客来进行不一样的行业短信营销 ...

  7. 最新企业春节祝福短信模板内容_2022年创意公司拜年短信文案

    企业春节祝福短信模板 新年快来到前,你幸福快乐是我的心"元",愿你烦恼忧愁都跑"元",好运频频来支"元",好事"元元"不 ...

  8. 阿里云短信模板整理方案

    阿里云短信模板整理方案 文章目录 阿里云短信模板整理方案 1.为什么要做短信模板的整理? 2.怎么管? 3.变量统一化 4.模板 5.短信服务模板发送工具类 6.接入OMS系统 7.工作难点 欢迎关注 ...

  9. 多商户系统更换短信模板操作

    使用多商户系统的时候,可能某些短信的模板并不太符合我们的需求,所以需要修改短信的模板及发送的短信内容,这里演示一下完整的操作. 申请短信模板 这里申请后等待审核,也可以联系客服或者售后技术处理,{$p ...

最新文章

  1. 聊天机器人之环境准备
  2. mysql查看表格的列信息
  3. 总结一下遇到的各种核函数
  4. vim中搭建与sourceinsight类似功能
  5. 链表反转2(Reverse Linked List II)
  6. 前端学习(736):函数的返回值return
  7. 【MySQL】向已有主键的表附加主键属性的自动编号
  8. 沉得住气的程序员们!
  9. python基本代码教程-Python入门教程丨1300多行代码,让你轻松掌握基础知识点
  10. redis 异常解决办法
  11. Java基础篇——垃圾回收
  12. echarts设置tooltips样式以及调取数据
  13. Namecheap 给域名添加ssl证书
  14. ios 强制横屏大总结
  15. MOOC北京理工《C语言程序设计(上)》第4周第2题:确定母亲节
  16. sns.heatmap用法
  17. 亚洲大数据峰会(香港站)总结
  18. 1、misa统计SRR结果
  19. ubuntu18.04 分辨率突然变小,添加1920x1080分辨率,转完变卡默认成集显llvmpipe改独显方法
  20. 简述驱动桥的动力传递路线_驱动桥

热门文章

  1. 平面设计出来可以干什么
  2. vim/ideavim命令
  3. 混合模式(工厂方法模式+策略模式+门面模式)
  4. 炉石传说服务器维护有补偿吗,炉石传说服务器故障怎么办 服务器故障补偿一览...
  5. 《图解TCP/IP》学习日志----四、TCP与UDP、应用层协议、WWW(万维网)
  6. PHP实现支付宝支付
  7. H3C全系列网络产品命名规则介绍
  8. Spring Cloud Alibaba中文文档
  9. 三目表达式如何省略一个表达式
  10. pytorch中的掩膜mask