日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時(shí)間:2023/12/4 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从真实项目中抠出来的设计模式——第一篇:策略模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有時(shí)候因?yàn)榉N種原因?qū)е挛覀儠?huì)寫(xiě)出很多丑陋的代碼,比如趕工時(shí),短暫性的偷懶,不會(huì)設(shè)計(jì)模式等等導(dǎo)致代碼沉積,一個(gè)cs上萬(wàn)行代碼這樣場(chǎng)景是有發(fā)生,

當(dāng)然這里也包括我。。。所以時(shí)間充裕一點(diǎn)之后就想重構(gòu)一下,畢竟項(xiàng)目中的需求是不斷變更的,面對(duì)需求變更,盡量做到最低限度的修改代碼,最大化的擴(kuò)充

新代碼,還有一點(diǎn)就是不要過(guò)分的追求設(shè)計(jì)模式,做到適可為止,太設(shè)計(jì)模式了會(huì)導(dǎo)致類(lèi)太多,不好管理,在項(xiàng)目開(kāi)發(fā)中,其實(shí)仔細(xì)考慮一下,你會(huì)發(fā)現(xiàn)很多業(yè)

務(wù)邏輯都有相應(yīng)的設(shè)計(jì)模式幫你優(yōu)化,畢竟這些都是前輩們踩了無(wú)數(shù)的坑,經(jīng)過(guò)無(wú)數(shù)的苦難留下來(lái)的智慧結(jié)晶。很多人列舉設(shè)計(jì)模式都喜歡用生活中的例子,但

畢竟生活中的例子如何應(yīng)用到項(xiàng)目中,對(duì)我們程序員來(lái)說(shuō)還是比較抽象的,所以這里我就列舉我們實(shí)際的業(yè)務(wù)邏輯場(chǎng)景。

?

一:實(shí)際場(chǎng)景介紹

? ? 我們?cè)谧銮饲娴臅r(shí)候,為了防止各大郵箱服務(wù)商對(duì)我們的郵件營(yíng)銷(xiāo)內(nèi)容做屏蔽處理,我們采用的策略就是眾多模板庫(kù)中隨機(jī)抽取一封html樣式表,然后結(jié)

合具體的商品列表生成完全不一樣風(fēng)格的營(yíng)銷(xiāo)內(nèi)容郵件,爭(zhēng)取最大可能的不被屏蔽,而用戶(hù)自己通過(guò)我們系統(tǒng)做的營(yíng)銷(xiāo)郵件,我們又不能隨機(jī)發(fā)送,而是用戶(hù)生成

什么樣的郵件,我們就發(fā)什么樣的郵件,ok,現(xiàn)在這里就有兩種策略場(chǎng)景了,兩種場(chǎng)景的最終目的都是生成郵件內(nèi)容,對(duì)吧。

?

1. 普通商家做營(yíng)銷(xiāo)活動(dòng)的郵件,這種策略沒(méi)什么好說(shuō)的,是什么就發(fā)什么。

2.千人千面場(chǎng)景下的營(yíng)銷(xiāo)活動(dòng)郵件,這種策略采用隨機(jī)抽取的模式,

?

目前來(lái)說(shuō),我們就這兩種場(chǎng)景,誰(shuí)也指不定以后還會(huì)不會(huì)有其他的策略出來(lái),所以有必要用策略模式玩一下。

?

二:構(gòu)建UML

? ? 從vs2005開(kāi)始就有一個(gè)強(qiáng)大的功能,根據(jù)cs文件自動(dòng)生成uml類(lèi)圖,非常的直觀也更容易的幫助我們?cè)O(shè)計(jì)更加合理的類(lèi)圖。

?

上面就是策略模式的uml圖,各個(gè)策略類(lèi)中都有一個(gè)Setup方法,用來(lái)設(shè)置email的內(nèi)容,具體各個(gè)類(lèi)中的代碼如下:

?

<1>?AbstractStrategy

public abstract class AbstractStrategy{
public abstract void Setup();}

?

<2>?RandStrategy

public class RandStrategy : AbstractStrategy

? ? {

? ? ? ? public override void Setup()

? ? ? ? {

? ? ? ? ? ? Console.WriteLine("千人千面模式下的郵件發(fā)送");

? ? ? ? }

? ? }

<3>?StraightStrategy?

public class StraightStrategy : AbstractStrategy

? ? {

? ? ? ? public override void Setup()

? ? ? ? {

? ? ? ? ? ? Console.WriteLine("普通商家發(fā)送的郵件");

? ? ? ? }

? ? }

<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();


? ? ? ? ? ? //設(shè)置“隨機(jī)策略“

? ? ? ? ? ? context.SetStrategy(new RandStrategy());


? ? ? ? ? ? context.Setup();


? ? ? ? ? ? //設(shè)置 ”直接發(fā)送“

? ? ? ? ? ? context.SetStrategy(new StraightStrategy());


? ? ? ? ? ? context.Setup();

? ? ? ? }

? ? }

?

最后我們運(yùn)行一下:

?

上面就是一個(gè)最簡(jiǎn)單的策略模式,當(dāng)我們?cè)O(shè)置不同的策略,就會(huì)執(zhí)行相應(yīng)的行為,實(shí)際當(dāng)中,并不會(huì)這么簡(jiǎn)單,畢竟設(shè)計(jì)模式只是一個(gè)最優(yōu)化的提煉,排除干擾看本質(zhì)。

?

三:生產(chǎn)應(yīng)用

? ?首先生產(chǎn)中我們的AbstractSetup中的Setup方法肯定是要帶有參數(shù)的,而不是簡(jiǎn)單的無(wú)參,如下:

/// <summary>

? ? /// 短信,郵件,彩信設(shè)置模型

? ? /// </summary>

? ? public abstract class AbstractSetup

? ? {

? ? ? ? public abstract void Setup(LeafletEntity leaflet, DataRow row);

? ? }

然后直接賦值的邏輯也非常的簡(jiǎn)單,需要根據(jù)數(shù)據(jù)庫(kù)中設(shè)置的業(yè)務(wù)邏輯判斷。

public class StraightSetup : AbstractSetup

? ? {

? ? ? ? public override void Setup(LeafletEntity leaflet, DataRow row)

? ? ? ? {

? ? ? ? ? ? //非顧問(wèn)

? ? ? ? ? ? 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"]);

? ? ? ? }

? ? }

接下來(lái)就是隨機(jī)抽取邏輯,這個(gè)也是通過(guò)讀取隨機(jī)表來(lái)進(jìn)行各種操作,簡(jiǎn)單的代碼如下:

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.郵件))

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? //第三步:動(dòng)態(tài)生成郵件模板

? ? ? ? ? ? ? ? ? ? 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);

? ? ? ? }

? ? }

好了,這個(gè)就是給大家演示的策略模式,簡(jiǎn)單來(lái)說(shuō)就是一句話:針對(duì)同一命令或行為,不同的策略做不同的動(dòng)作。?

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


.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的从真实项目中抠出来的设计模式——第一篇:策略模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。