善用设计模式改善我们丑陋的代码——策略模式
来源:互联网 发布:淘宝店开什么好 编辑:程序博客网 时间:2024/05/17 06:26
有时候因为种种原因导致我们会写出很多丑陋的代码,比如赶工时,短暂性的偷懒,不会设计模式等等导致代码沉积,一个cs上万行代码这样场景是有发生,
当然这里也包括我。。。所以时间充裕一点之后就想重构一下,毕竟项目中的需求是不断变更的,面对需求变更,尽量做到最低限度的修改代码,最大化的扩充
新代码,还有一点就是不要过分的追求设计模式,做到适可为止,太设计模式了会导致类太多,不好管理,在项目开发中,其实仔细考虑一下,你会发现很多业
务逻辑都有相应的设计模式帮你优化,毕竟这些都是前辈们踩了无数的坑,经过无数的苦难留下来的智慧结晶。很多人列举设计模式都喜欢用生活中的例子,但
毕竟生活中的例子如何应用到项目中,对我们程序员来说还是比较抽象的,所以这里我就列举我们实际的业务逻辑场景。
一:实际场景介绍
我们在做千人千面的时候,为了防止各大邮箱服务商对我们的邮件营销内容做屏蔽处理,我们采用的策略就是众多模板库中随机抽取一封html样式表,然后结
合具体的商品列表生成完全不一样风格的营销内容邮件,争取最大可能的不被屏蔽,而用户自己通过我们系统做的营销邮件,我们又不能随机发送,而是用户生成
什么样的邮件,我们就发什么样的邮件,ok,现在这里就有两种策略场景了,两种场景的最终目的都是生成邮件内容,对吧。
1. 普通商家做营销活动的邮件,这种策略没什么好说的,是什么就发什么。
2.千人千面场景下的营销活动邮件,这种策略采用随机抽取的模式,
目前来说,我们就这两种场景,谁也指不定以后还会不会有其他的策略出来,所以有必要用策略模式玩一下。
二:构建UML
从vs2005开始就有一个强大的功能,根据cs文件自动生成uml类图,非常的直观也更容易的帮助我们设计更加合理的类图。
上面就是策略模式的uml图,各个策略类中都有一个Setup方法,用来设置email的内容,具体各个类中的代码如下:
<1> AbstractStrategy
public abstract class AbstractStrategy { public abstract void Setup(); }
<2> RandStrategy
public class RandStrategy : AbstractStrategy { public override void Setup() { Console.WriteLine("千人千面模式下的邮件发送"); } }
<3> StraightStrategy
public class StraightStrategy : AbstractStrategy { public override void Setup() { Console.WriteLine("普通商家发送的邮件"); } }
<4>StrategyContext
public class StrategyContext { AbstractStrategy strategy = null; public void SetStrategy(AbstractStrategy strategy) { this.strategy = strategy; } public void Setup() { this.strategy.Setup(); } }
<5> Program
class Program { static void Main(string[] args) { StrategyContext context = new StrategyContext(); //设置“随机策略“ context.SetStrategy(new RandStrategy()); context.Setup(); //设置 ”直接发送“ context.SetStrategy(new StraightStrategy()); context.Setup(); } }
最后我们运行一下:
上面就是一个最简单的策略模式,当我们设置不同的策略,就会执行相应的行为,实际当中,并不会这么简单,毕竟设计模式只是一个最优化的提炼,排除干扰看本质。
三:生产应用
首先生产中我们的AbstractSetup中的Setup方法肯定是要带有参数的,而不是简单的无参,如下:
/// <summary> /// 短信,邮件,彩信设置模型 /// </summary> public abstract class AbstractSetup { public abstract void Setup(LeafletEntity leaflet, DataRow row); }
然后直接赋值的逻辑也非常的简单,需要根据数据库中设置的业务逻辑判断。
public class StraightSetup : AbstractSetup { public override void Setup(LeafletEntity leaflet, DataRow row) { //非顾问 leaflet.Title = MySqlDbHelper.GetString(row, "title"); leaflet.SMSContent = leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.短信) ? MySqlDbHelper.GetString(row, "content") : string.Empty; leaflet.EDMContent = leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.邮件) ? MySqlDbHelper.GetString(row, "content") : string.Empty; leaflet.MMSContent = leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.彩信) ? MySqlDbHelper.GetString(row, "content") : string.Empty; leaflet.SendSMSCount = Convert.ToInt32(row["sendcount"]); } }
接下来就是随机抽取逻辑,这个也是通过读取随机表来进行各种操作,简单的代码如下:
public class RandSetup : AbstractSetup { EventMarketingBLLNew eventMarketingBLLNew = new EventMarketingBLLNew(); public override void Setup(LeafletEntity leaflet, DataRow row) { var eventMarketingInfo = eventMarketingBLLNew.GetEventMarketingInfo(leaflet.MarketingID, leaflet.ShopID); if (eventMarketingInfo != null) { //“短信”和“邮件”信息 var communicationInfo = eventMarketingInfo.EventmarketingSmsEdmContentList.OrderBy(m => Guid.NewGuid()) .FirstOrDefault(); if (communicationInfo == null) return; if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.邮件)) { //第三步:动态生成邮件模板 var styleInfo = CacheUtil.GetRandomEmailStyle(); var tuple = new EdmDraftBoxBLL().GetEdmHtmlTitle(communicationInfo.EDMJson, styleInfo.StyleId); leaflet.Title = tuple.Item1; leaflet.EDMContent = tuple.Item2; leaflet.Header = tuple.Item3; leaflet.SendSMSCount = 1; } if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.短信)) { leaflet.SMSContent = communicationInfo.SMSContent; leaflet.SendSMSCount = communicationInfo.SMSCount; } if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.彩信)) { leaflet.MMSContent = communicationInfo.MMSContent; } } } }
最后就是策略上下文:
public class SetupContext { AbstractSetup abstractSetup = null; public void Set(AbstractSetup abstractSetup) { this.abstractSetup = abstractSetup; } public void Setup(LeafletEntity leaflet, DataRow row) { this.abstractSetup.Setup(leaflet, row); } }
好了,这个就是给大家演示的策略模式,简单来说就是一句话:针对同一命令或行为,不同的策略做不同的动作。
- 善用设计模式改善我们丑陋的代码——策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 2.1 善用设计模式
- 善用设计模式-代理模式
- 设计模式——策略设计模式
- 游戏项目中运用到的设计模式(二)...策略模式(strategy)(《重构-改善既有代码的设计》读后做)
- Python 设计模式——用模式改善软件设计
- 萌新的前端之旅
- 学习笔记_头文件climits发起的关于c++数据处理的一系列整理
- C语言实验——最值 (sdut oj)
- Observer
- ImportError: cannot import name 'NUMPY_MKL'
- 善用设计模式改善我们丑陋的代码——策略模式
- 保留小数点后几位数
- 第零篇 windows docker的奇幻旅程
- [BZOJ1856][Scoi2010]字符串(卡特兰数+组合数学)
- 核主成分分析KPCA分析
- hdoj2000
- 【Unity&拓展编辑器&插件】开始插件,拓展编辑器教程
- 英语修改润色句子更正1
- AndroidStudio中导入module(超详细)