经典的策略模式如下图所示:
让我解释一下这幅图的含义,IContext是上下文的接口类,IStrategy是策略的接口,IStrategy依赖于IContext,也就是IContext里面存有一个IStrategy的策略字段。
其实策略模式说白了,就像诸葛亮给刘备的锦囊妙计一样,遇到一种具体的情况,采取一种相应的策略。也就像我们平时会观察天气,根据今天有没有下雨,选择要不要打伞,下雨的话,那么打伞;不下雨就不打伞。
下面我们用代码来演示一下经典的策略模式。我们将要做的是,从一个数组中提取一个值,这个值的提取要根据用户的选择,也就是我们要根据用户的选择提取对应的值。假设用户有三种选择,选最大值,最小值,选第一个值。
1、首先我们要实现公共接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BangWorks.PractcalPattern.StategyPattern.Classic { interface IStrategy { /// <summary> /// 按照算法的要求,将数据提取出来 /// </summary> /// <param name="Data">数组</param> /// <returns></returns> int PickUp(int[] Data); } interface IContext { IStrategy Strategy { get; set; } int GetData(int[] data); } }
2、实现相应的策略类
/// <summary> /// 取最大值 /// </summary> class DescentSortStrategy:IStrategy { int IStrategy.PickUp(int[] Data) { Array.Sort<int>(Data); return Data[Data.Length-1]; } } /// <summary> /// 取第一个值 /// </summary> class FirstDataStrategy:IStrategy { public int PickUp(int[] Data) { return Data[0]; } } /// <summary> /// 取最小值 /// </summary> class AscentStrategy:IStrategy { int IStrategy.PickUp(int[] Data) { Array.Sort<int>(Data); return Data[0]; } }
3、最后,我们利用策略模式来切换策略
/// <summary> ///GetData 的测试 ///</summary> [TestMethod()] public void GetDataTest() { IStrategy mStrategy = new FirstDataStrategy(); IContext target = CreateIContext(); int[] data = new int[]{7,2,5,8,0,1}; //切换成取第一个值的 target.Strategy = mStrategy; int expected = 7; int actual; actual = target.GetData(data); Assert.AreEqual(expected, actual); //切换成取最小值的 target.Strategy = new AscentStrategy(); expected = 0; actual = target.GetData(data); Assert.AreEqual(expected, actual); //切换成取最大值的 target.Strategy = new DescentSortStrategy(); expected = 8; actual = target.GetData(data); Assert.AreEqual(expected, actual); }
最后附上完整的单元测试类
完整策略模式单元测试类
本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/p/3285395.html如需转载请自行联系原作者
kissazi2