有时候因为种种原因导致我们会写出很多丑陋的代码,比如赶工时,短暂性的偷懒,不会设计模式等等导致代码沉积,一个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);

}

}

好了,这个就是给大家演示的策略模式,简单来说就是一句话:针对同一命令或行为,不同的策略做不同的动作。

原文地址:http://www.cnblogs.com/huangxincheng/p/6347633.html

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

从真实项目中抠出来的设计模式——第一篇:策略模式相关推荐

  1. 从真实项目中抠出来的设计模式——第二篇:过滤器模式

    一:实际场景介绍 我们在给用户做订单催付通知的时候,会有这样的一种场景,用户在系统后台设置一组可以催付的规则,比如说订单金额大于xx元,非黑名单用户,来自 哪个地区,已购买过某个商品,指定某个营销活动 ...

  2. 从真实项目中抠出来的设计模式——第三篇:责任链模式

    一:现实场景 有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给实体赋值,如果是短信,邮件又是其他方式的赋 ...

  3. C#项目中常用到的设计模式

    C#项目中常用到的设计模式 1. 引言 一个项目的通常都是从Demo开始,不断为项目添加新的功能以及重构,也许刚开始的时候代码显得非常凌乱,毫无设计可言.但是随着项目的迭代,往往需要将很多相同功能的代 ...

  4. 前端人真实项目中遇到的问题总结

    // 以下题目有简单也有难的(具体看你怎么定义). // 如果能做到立马想出答案的,则前端算是学的不错的了. // 如果需要百度才能做出来(直接百度答案的,我就只能说你开心就好),那么也说明一般. / ...

  5. Java之真实项目中的章节排序实例

    开心一笑 [临终要求: 一犯人被执行枪决 ,由于子弹是劣质的,第一枪没放出,接着又放了第二枪-第三枪-这时犯人哭了:大哥你掐死我吧,太他妈吓人了!] 视频教程 大家好,我录制的视频<Java之优 ...

  6. VMware虚拟化项目中经常使用的三种磁盘置备模式 vmware- vsphere- datastore-disk

    VMware虚拟化项目中经常使用的三种磁盘置备模式 说明: 在虚拟化集群搭建完成,创建虚拟机的时候我们的虚拟机磁盘创建存在三种选择,不同的选择代表磁盘的工作模式也不同. 1.厚置备延迟置零: 这是默认 ...

  7. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  8. 设计模式入门(策略模式)

    [0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...

  9. Vue项目实战 —— 后台管理系统( pc端 ) 第一篇

    前期回顾     我只写注释 -- 让Ai写代码_0.活在风浪里的博客-CSDN博客前期回顾 Vue项目实战 -- 哔哩哔哩移动端开发-- 第二篇_0.活在风浪里的博客-CSDN博客https://b ...

最新文章

  1. C++的STL 栈实现 判断栈的出栈顺序是否合理
  2. 【c语言】模拟库函数strstr
  3. winform自动更新之AutoUpdater.NET
  4. 什么?物联网方向也能发论文了?
  5. Linux C 预处理详解
  6. php 克隆对象,php中对象的复制与克隆
  7. video4linux 安装,【精品博文】Video4linux 下视频编程的流程
  8. 01-object类,常用API
  9. MAC版CRT使用心得
  10. 步步为营,重构出模式(2)
  11. 语言学博士、Kaggle数据分析师,她说:读研不是必选项,这4项技能学校不教
  12. 2分钟教你部署2048小游戏到云服务器
  13. Java基础之《netty(28)—TCP粘包拆包原理》
  14. RoundProgressBar(圆形进度条)
  15. 【uniapp】 uni-app使用getPhoneNumber接口
  16. 关于win10基础上安装ubuntu遇到的坑
  17. java .class文件为什么以CAFEBABE开头?
  18. 【机器学习入门——1】Python 开发环境的安装 Python(x,y)及Pycharm
  19. IT人的学习方法论(全)
  20. 基于Redis组件之分布式RateLimiter限流

热门文章

  1. 新装机器如何修改IP地址
  2. 【百度分享】基于内核模块的测试代码编写(二)
  3. C# 离线人脸识别 ArcSoft
  4. 文末有彩蛋 | 第四周课程回顾与总结
  5. 如何排查 StackOverflow 异常
  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...
  7. NPOI 在指定单元格导入导出图片
  8. .Net 5性能改进
  9. gRPC-微服务间通信实践
  10. 初识ABP vNext(11):聚合根、仓储、领域服务、应用服务、Blob储存