知识大全 老生常谈:策略模式
Posted 知
篇首语:人生难得几回搏,此时不搏待何时。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 老生常谈:策略模式相关的知识,希望对你有一定的参考价值。
本来园子里面已经有很多特别好的关于设计模式学习的文章 但一般都是概念性的或者都是些简单实例 没有用过设计模式的朋友看过之后虽然明白怎么回事了 但是对于自己实际项目中何时用设计模式就不太清楚了 本人借jillzhang开发的控件中的部分代码与大家讨论下模式在具体项目中的应用 好的代码应该与大家分享
名词解释:
策略: :战略(学)
:策略 计谋 作战方针; 智谋 手腕
从策略一词来看 策略模式是种倾向于行为的模式 有点类似找仗时的做战方案 一般司令员在做战前都会根据实际情况做出几套不同的方案 如果当时情况有变 就会根据相应的条件来判定用哪一套方案来替换原定方案 但无论如何替换 替换多少次 仗还是要打的
在他的文章中给GRIDVIEW添加上数据导出成EXCEL WORD PDF文件的功能 这三类导出虽然具体操作略有不同 但是大部分都相同
具体策略模式的类图:
策略模式定义(GOF):
策略模式:主要是定义一系列的算法 把这些算法一个个封装成拥有共同接口的类 它们之间可以互换 使客户端调用它们的时候能够互不影响地变化
具体代码如下
第一 数据导出的接口类:IExporter
抽象策略(Strategy)角色 这是一个抽象角色 通常由一个接口或抽象类实现 此角色给出所有的具体策略类所需的接口
Code /**//// <summary> /// 将GridView导出到其他文件的接口 /// </summary> public interface IExporter /**//// <summary> /// 输出编码 /// </summary> Encoding ResponseEncoding get; /**//// <summary> /// 导出文件的名称 /// </summary> string ExportFileName get; /**//// <summary> /// 将GirdView导出为其他格式的文件 /// </summary> /// <param name= grid >要导出的GridView对象</param> /// <param name= unExportedColumnNames >不导出的列名称集合</param> void Export(GridViewEx grid);
下面为实现了此接口的抽象类
Code public abstract class Exporter:IExporter private fields#region private fields Encoding _responseEncoding; string _exportFileName; #endregion my constructors#region my constructors public Exporter(Encoding encoding string outName) this _responseEncoding = encoding; this _exportFileName = outName; #endregion public property#region public property /**//// <summary> /// 输出编码 /// </summary> public Encoding ResponseEncoding get return _responseEncoding; /**//// <summary> /// 导出文件的名称 /// </summary> public string ExportFileName get return _exportFileName; #endregion public methods#region public methods /**//// <summary> /// 将GirdView导出为其他格式的文件 /// </summary> /// <param name= grid >要导出的GridView对象</param> /// <param name= unExportedColumnNames >不导出的列名称集合</param> public abstract void Export(GridViewEx grid); #endregion private methods#region private methods protected string ReplaceHref(string ) string content = Regex Replace( (<a[^>]+>)|(</a>) ); return content; protected virtual void Export(GridViewEx grid string extension string contentType) //具体代码略 #endregion第二 context
环境(Context)角色 持有一个Strategy类的引用
Code DropDownList drop = dropList; if (drop != null) if (drop SelectedIndex > ) switch (drop SelectedValue) case Excel : IExporter exporter = new ExcelExporter(Encoding GetEncoding( gb ) this _exportFileName); ExporterHelper Export(Owner exporter); break; case Word : IExporter exporter = new WordExporter(Encoding GetEncoding( gb ) this _exportFileName); ExporterHelper Export(Owner exporter); break; case Pdf : IExporter exporter = new PdfExporter(Encoding GetEncoding( gb ) this _exportFileName); ExporterHelper Export(Owner exporter); break;[nextpate]
第三 具体实现类
具体策略(ConcreteStrategy)角色 包装了相关的算法或行为
下面是三个具体操作类
Code /**//// <summary> /// Excel导出 /// </summary> public class ExcelExporter:Exporter private fields#region private fields static readonly string extension = xls ; static readonly string contentType = application/vnd xls ; #endregion my constructors#region my constructors public ExcelExporter(Encoding encoding string outName):base(encoding outName) #endregion public methods#region public methods /**//// <summary> /// 将GirdView导出为其他格式的文件 /// </summary> /// <param name= grid >要导出的GridView对象</param> /// <param name= unExportedColumnNames >不导出的列名称集合</param> public override void Export(GridViewEx grid) Export(grid extension contentType); #endregionPdfExporter:
Code public class PdfExporter : Exporter static readonly string extension = pdf ; static readonly string contentType = application/pdf ; public PdfExporter(Encoding encoding string outName) : base(encoding outName) public override void Export(GridViewEx grid) //具体代码略WordExporter:
Code /**//// <summary> /// Word导出 /// </summary> public class WordExporter:Exporter private fields#region private fields static readonly string extension = doc ; static readonly string contentType = application/ms word ; #endregion my constructors#region my constructors public WordExporter(Encoding encoding string outName) : base(encoding outName) #endregion public methods#region public methods /**//// <summary> /// 将GirdView导出为其他格式的文件 /// </summary> /// <param name= grid >要导出的GridView对象</param> /// <param name= unExportedColumnNames >不导出的列名称集合</param> public override void Export(GridViewEx grid) Export(grid extension contentType); #endregion
策略模式优点 算法的使用和算法本身解耦 即把变化的具体算法封装了起来 策略模式是除了继承之外的一种弹性替代方案 如果你使用继承定义了一个类 下面有部分的派生类 此时你会让基类所困住 要想修改它特别不容易 而策略模式则可能通过组合不同的对象来改变行为
策略模式缺点
虽说客户代码无须关心各个策略是如何实现的 但是它们还是要知道有多少种策略实现 具体功能情况 这样才可以根据需要使用哪个策略
使用策略模式后出现很多小类
总结
cha138/Article/program/net/201311/13392相关参考