策略模式

来源:互联网 发布:淘宝童装店名大全 编辑:程序博客网 时间:2024/06/04 18:08


策略模式分析

      它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户


    策略模式的结构图:

   


  在策略模式中,核心代码为:



在此模式中,主要通过对Context创建时,传入一个具体的策略,再通过Context的ContextInterface()方法中调用具体策略的算法,实现对具体策略的选择和创建的  (如下:客户端代码)。


    


策略模式示例

       现在要实现对学生的排序,现有三种排序方法,分别为:按照姓名排序,按照学号排序,按照学生成绩进行排序(其实最后一种排序方法是我最抵触的唉~桑心~) 用策略模式描述为:


   


   代码如下:

  

    抽象的分类方法类和具体的分类方法类:

abstract class SortMethod  //排列方法    {                public abstract void GetSortedStu();    }    class SortByName:SortMethod  //按照学生的姓名进行排列    {        public override void GetSortedStu()        {            Console.WriteLine("(此处写具体的排列方法)这是按照学生的姓名进行排列的。");        }     }    class SortedByStuNum : SortMethod  //按照学生的学号进行排列    {        public override void GetSortedStu()        {            Console.WriteLine("(此处写具体的排列方法)这是按照学生的成绩进行排列的。");                   }    }    class SortedByMark : SortMethod //按照学生的成绩进行排列    {        public override void GetSortedStu()        {            Console.WriteLine("(此处写具体的排列方法)这是按照学生的分数进行排列");        }    }

Context类:


class SortContext    {        private SortMethod sm ; //声明一个抽象的分类方法        public SortContext(SortMethod sortmethod)  //构造方法        {            this.sm = sortmethod;  //将构造方法中的分类方法赋值给本类对象,此处传入了具体的策略         }        public void Sort()        {            sm.GetSortedStu();  //根据传入的具体策略,调用它们相应的分类方法        }    }


客户端代码:

class Program    {        static void Main(string[] args)        {            SortContext sc;            sc = new SortContext(new SortByName());  //按照名字分类            sc.Sort();            sc = new SortContext(new SortedByStuNum());  //按照学号分类            sc.Sort();            sc = new SortContext(new SortedByMark());   //按照成绩分类            sc.Sort();        }    }

   当我们要改变分类方式,比如,现在增加一个按照家乡排序的方法,或者当我们要改变某一种具体的排列方式,比如,按照学号递减的顺序排列。。等需求的变动时,我们修改起来比较容易。


策略模式优点

   策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

    策略模式的Strategy类层为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。

   简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。





0 0
原创粉丝点击