知识大全 老生常谈:策略模式

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);                #endregion

  PdfExporter:

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

相关参考

知识大全 老生常谈:解释器模式

    解释器模式的目的:  如果某一类问题一再的发生此时比较好的做法是将此类问题的各个实例表达为一个简单语言中的语句这样可以建造一个解释器通过解释这些语句达到

知识大全 老生常谈:建造者模式

  设计:  人类通过劳动改造世界创造文明创造物质财富和精神财富而最基础最主要的创造活动是造物设计便是造物活动进行预先的计划可以把任何造物活动的计划技术和计划过程理解为设计意指有目标和计划的创作行为&

策略指数的运作模式

策略指数的运作模式由于策略本身是开放型的,因此策略指数的开发过程必然是指数开发人员、资产所有人、投资顾问等参与方互动的结果。目前海外策略指数的开发大致有两种运作模式:1)自上而下。通常是由资产管理公司

知识大全 设计模式之Strategy(策略)

设计模式之Strategy(策略)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Strateg

知识大全 应用策略模式为List排序

应用策略模式为List排序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  编程时遇到排序在平常不

知识大全 老生常谈 16个经典面试问题回答思路

  面试过程中,面试官会向应征者发问,而应征者的回答将成为面试官考虑是否接受他的重要依据。对应征者而言,了解这些问题背后的「猫腻」至关重要。本文对面试中经常出现的一些典型问题进行了

如何提高养鱼质量的策略

区域养殖,均衡上市对于池塘同一种商品鱼,可以按照鱼种规格,分档至二三种规格,按照大小分类结果进行放养,强化养鱼放养模式,结合相应的养殖技术,在鱼类上市的时候,采用捕大留小的原则,并结合鱼塘实际存鱼量和

如何提高养鱼质量的策略

区域养殖,均衡上市对于池塘同一种商品鱼,可以按照鱼种规格,分档至二三种规格,按照大小分类结果进行放养,强化养鱼放养模式,结合相应的养殖技术,在鱼类上市的时候,采用捕大留小的原则,并结合鱼塘实际存鱼量和

知识大全 有财务模式这一概念吗

有财务模式这一概念吗?或者说财务模式有哪些呢?有财务模式这一概念:其内容具体可以分为九大模块1.损益表2.资产负债表3.现金流量表4.现金为王5.利润操控6.财务分析7.360管控8.上市策略9.兼并

怎么鉴别尿布牛皮癣

牛皮癣的诊断与治疗是现在老生常谈的问题,由于牛皮癣是各个年龄段的人都会受到此病的侵害,导致婴儿也不能幸免于难。婴儿最常见的应该是尿布牛皮癣,婴儿经常会使用尿布,尿液中尿素就会导致牛皮癣的发生。那么,我