簡介: 定義了演算法家族,分別封裝起來,可以讓他們之間相互替換。此模式可以讓演算法的變化,不會影響到使用演算法的客戶。【行為型模式】 結構圖: 優點: 缺點: 應用場景: 需要在不同時間應用不同的業務規則時,就可以使用策略模式處理這種變化的可能性。 註意事項: 示例: 1.結構類圖的實現: Strateg ...
簡介:
定義了演算法家族,分別封裝起來,可以讓他們之間相互替換。此模式可以讓演算法的變化,不會影響到使用演算法的客戶。【行為型模式】
結構圖:
優點:
- 策略模式是一種定義一系列演算法的方法,從概念上來看,這些演算法都是完成相同的工作,只是實現不同。它可以以相同的方式調用所有的演算法,減少了各種演算法類與調用演算法類之間的耦合性 ;
- 策略模式簡化了單元測試,因為每一種演算法都有自己的類,可以通過調用自己的介面單獨測試;
- 策略模式的Strategy類層次為Context定義了一系列可供重用的演算法或行為。繼承有助於析取出這些演算法中的公共功能。
缺點:
- 所有策略類都需要對外暴露;
- 策略類一多,就很難維護。
應用場景:
需要在不同時間應用不同的業務規則時,就可以使用策略模式處理這種變化的可能性。
註意事項:
- 在基本策略模式中,選擇所用具體實現的職責是在客戶端實現,可以專有Context類型(可見示例2);
- 所用策略都要實現同一介面。
示例:
1.結構類圖的實現:
Strategy類,定義所有支持的演算法的公共介面;
ConcreteStrategy類,封裝了具體的演算法或行為,繼承於Strategy
/// <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對象的引用
/// <summary> /// 上下文 /// </summary> public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } /// <summary> /// 上下文介面 /// </summary> public void ContextInterface() { strategy.AlgorithmInterface(); } }
客戶端
Context context = new Context(new ConcreteStrategyA()); context.ContextInterface(); context = new Context(new ConcreteStrategyB()); context.ContextInterface(); context = new Context(new ConcreteStrategyC()); context.ContextInterface();
結果
2.策略模式之撩妹2
話說上次撩妹(代理模式)失敗後,痛定思痛,尋求新的方法。得到一個智囊【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);
結果
請多多指教~