定义了算法家族,分别封装起来,能够让他们之间相互替换。此模式能够让算法的变化,不会影响到使用算法的客户。【行为型模式】算法
须要在不一样时间应用不一样的业务规则时,就能够使用策略模式处理这种变化的可能性。ide
1.结构类图的实现:单元测试
Strategy类,定义全部支持的算法的公共接口;测试
ConcreteStrategy类,封装了具体的算法或行为,继承于Strategythis
/// <summary> /// 策略类 /// </summary> public abstract class Strategy { /// <summary> /// 算法接口 /// </summary> public abstract void AlgorithmInterface(); } public class ConcreteStrategyA : Strategy { public override void AlgorithmInterface() { Console.WriteLine("我是策略算法A"); } } public class ConcreteStrategyB : Strategy { public override void AlgorithmInterface() { Console.WriteLine("我是策略算法B"); } } public class ConcreteStrategyC : Strategy { public override void AlgorithmInterface() { Console.WriteLine("我是策略算法C"); } }
Context类,用一个ConcreteStrategy来配置,维护一个Strategy对象的引用spa
/// <summary> /// 上下文 /// </summary> public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } /// <summary> /// 上下文接口 /// </summary> public void ContextInterface() { strategy.AlgorithmInterface(); } }
客户端3d
Context context = new Context(new ConcreteStrategyA()); context.ContextInterface(); context = new Context(new ConcreteStrategyB()); context.ContextInterface(); context = new Context(new ConcreteStrategyC()); context.ContextInterface();
结果代理
2.策略模式之撩妹2code
话说上次撩妹(代理模式)失败后,痛定思痛,寻求新的方法。获得一个智囊【Context】,告诉我如何在不一样阶段使用不一样的撩妹技巧【Strategy】。对象
撩妹策略
/// <summary> /// 撩妹策略接口 /// </summary> public interface IChaseGirlStrategy { void ChaseGirl(); } /// <summary> /// 相见时的策略 /// </summary> public class XiangjianStrategy : IChaseGirlStrategy { public void ChaseGirl() { Console.WriteLine("1.了解女孩儿的爱好"); Console.WriteLine("2.多和女孩聊天"); } } /// <summary> /// 相识时的策略 /// </summary> public class XiangshiStrategy : IChaseGirlStrategy { public void ChaseGirl() { Console.WriteLine("1.约女孩儿看电影"); Console.WriteLine("2.约女孩儿吃饭"); } } /// <summary> /// 相知时的策略 /// </summary> public class XiangzhiStrategy : IChaseGirlStrategy { public void ChaseGirl() { Console.WriteLine("1.多送小礼物"); Console.WriteLine("2.相约出去旅游"); } }
智囊
/// <summary> /// 智囊 /// </summary> public class BigThink { private IChaseGirlStrategy strategy; /// <summary> /// 策略模式和工厂模式结合 /// </summary> /// <param name="type"></param> public BigThink(string type) { switch (type) { case "1": strategy = new XiangjianStrategy(); break; case "2": strategy = new XiangshiStrategy(); break; case "3": strategy = new XiangzhiStrategy(); break; } } /// <summary> /// 获取策略 /// </summary> public void GetStrategy() { strategy.ChaseGirl(); } }
客户端
string[] flags = { "1", "2", "3" }; Console.WriteLine("*************************************"); Console.WriteLine("请选择所处阶段,获取相应策略"); Console.WriteLine("【1】:相见时..."); Console.WriteLine("【2】:相识时..."); Console.WriteLine("【3】:相知时..."); Console.WriteLine("*************************************"); bool isRun = true; do { var flag = Console.ReadLine(); if (flags.Contains(flag)) { BigThink bigThink = new BigThink(flag); bigThink.GetStrategy(); Console.WriteLine("............................."); Console.WriteLine("按上述指令以外按键退出..."); } else { isRun = false; } } while (isRun);
结果
请多多指教~