定義了算法家族,分別封裝起來,能夠讓他們之間相互替換。此模式能夠讓算法的變化,不會影響到使用算法的客戶。【行爲型模式】算法
須要在不一樣時間應用不一樣的業務規則時,就能夠使用策略模式處理這種變化的可能性。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);
結果
請多多指教~