策略模式分析
它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式的结构图:
在策略模式中,核心代码为:
在此模式中,主要通过对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定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。