الگوی Strategy

الگوی Strategy در دسته الگوهای رفتاری قرار دارد. تعریف یک خانواده از الگوریتم ها، کپسوله کردن هر یک، و آنها را قابل تعویض می کند. استراتژی اجازه می دهد که الگوریتم به طور مستقل از کلاینت هایی که از آن استفاده می کنند ،متفاوت باشد.به عبارت دیگر تعریف واسط بیرونی یک الگوریتم به شکل انتزاعی به منظور فراهم کردن پیاده سازی آن به شکل های مختلف. UML class diagram شركت كنندگان کلاس ها و اشیاء شرکت کننده در این الگو عبارتند از:استراتژی Strategy (استراتژی مرتبسازی در مثال دنیای واقعی SortStrategy):یک واسط مشترک را برای همه الگوریتم های که پشتیبانی می کند. زمینه(Context) از این واسط برای فراخوانی الگوریتم تعریف شده توسط ConcreteStrategy استفاده می کند.به عبارت دیگر کلاسی انتزاعی که ساختار کلی استراتژی و توانایی‌های آن را تعریف می کند. واسط الگوریتم AlgorithmInterface():متد اصلی شروع الگوریتم. استراتژی سفت ConcreteStrategy (مرتبسازی سریع ، شل ، ادغامیQuickSort, ShellSort, MergeSort):الگوریتم را با استفاده از واسط (Interface) استراتژی پیاده سازی می کند.( کلاس هایی که الگوریتم را پیاده سازی کرده اند. )زمینه Context (لیست مرتب شده SortedList): با یک شی ConcreteStrategy پیکربندی شده است. مرجع(reference) یک شیء استراتژی را حفظ می کند.ممکن است یک واسط را تعریف کند که به استراتژی اجازه دسترسی به داده هایش را بدهد. به عبارت دیگر کلاسی که استراتژی را استفاده می کند. ساختار کلی کد الگوی استراتژی را نشان می دهد که قابلیت کپسول کردن در قالب یک شی. این به کلاینت ها اجازه می دهد که به صورت پویا راهبردهای الگوریتمی را تغییر دهند. using System; namespace DoFactory.GangOfFour.Strategy.Structural { /// <summary> /// MainApp startup class for Structural /// Strategy Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> static void Main () { Context context; // Three contexts following different strategies context = new Context (new ConcreteStrategyA ()); context.ContextInterface (); context = new Context (new ConcreteStrategyB ()); context.ContextInterface (); context = new Context (new ConcreteStrategyC ()); context.ContextInterface (); // Wait for user Console.ReadKey (); } } /// <summary> /// The 'Strategy' abstract class /// </summary> abstract class Strategy { public abstract void AlgorithmInterface (); } /// <summary> /// A 'ConcreteStrategy' class /// </summary> class ConcreteStrategyA : Strategy { public override void AlgorithmInterface () { Console.WriteLine ( "Called ConcreteStrategyA.AlgorithmInterface()"); } } /// <summary> /// A 'ConcreteStrategy' class /// </summary> class ConcreteStrategyB : Strategy { public override void AlgorithmInterface () { Console.WriteLine ( "Called ConcreteStrategyB.AlgorithmInterface()"); } } /// <summary> /// A 'ConcreteStrategy' class /// </summary> class ConcreteStrategyC : Strategy { public override void AlgorithmInterface () { Console.WriteLine ( "Called ConcreteStrategyC.AlgorithmInterface()"); } } /// <summary> /// The 'Context' class /// </summary> class Context { private Strategy _strategy; // Constructor public Context (Strategy strategy) { this._strategy = strategy; } public void ContextInterface () { _strategy.AlgorithmInterface (); } } } OutputCalled ConcreteStrategyA.AlgorithmInterface ()Called ConcreteStrategyB.AlgorithmInterface ()Called ConcreteStrategyC.AlgorithmInterface ()مثال دنیای واقعیالگوی استراتژی را نشان می دهد که کپسوله سازی الگوریتم های مرتب سازی را در قالب اشیا مرتب سازی می کند. این به کلاینت ها اجازه می دهد که به طور پویا راهبردهای مرتب سازی از جمله Quicksort، Shellsort و Mergesort را تغییر دهند. using System; using System.Collections.Generic; namespace DoFactory.GangOfFour.Strategy.RealWorld { /// <summary> /// MainApp startup class for Real-World /// Strategy Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> static void Main () { // Two contexts following different strategies SortedList studentRecords = new SortedList (); studentRecords.Add ("Samual"); studentRecords.Add ("Jimmy"); studentRecords.Add ("Sandra"); studentRecords.Add ("Vivek"); studentRecords.Add ("Anna"); studentRecords.SetSortStrategy (new QuickSort ()); studentRecords.Sort (); studentRecords.SetSortStrategy (new ShellSort ()); studentRecords.Sort (); studentRecords.SetSortStrategy (new MergeSort ()); studentRecords.Sort (); // Wait for user Console.ReadKey (); } } /// <summary> /// The 'Strategy' abstract class /// </summary> abstract class SortStrategy { public abstract void Sort (List<string> list); } /// <summary> /// A 'ConcreteStrategy' class /// </summary> class QuickSort : SortStrategy { public override void Sort (List<string> list) { list.Sort (); // Default is Quicksort Console.WriteLine ("QuickSorted list "); } } /// <summary> /// A 'ConcreteStrategy' class /// </summary> class ShellSort : SortStrategy { public override void Sort (List<string> list) { //list.ShellSort(); not-implemented Console.WriteLine ("ShellSorted list "); } } /// <summary> /// A 'ConcreteStrategy' class /// </summary> class MergeSort : SortStrategy { public override void Sort (List<string> list) { //list.MergeSort(); not-implemented Console.WriteLine ("MergeSorted list "); } } /// <summary> /// The 'Context' class /// </summary> class SortedList { private List<string> _list = new List<string> (); private SortStrategy _sortstrategy; public void SetSortStrategy (SortStrategy sortstrategy) { this._sortstrategy = sortstrategy; } public void Add (string name) { _list.Add (name); } public void Sort () { _sortstrategy.Sort (_list); // Iterate over list and display results foreach (string name in _list) { Console.WriteLine (" " + name); } Console.WriteLine (); } } } OutputQuickSorted listAnnaJimmySamualSandraVivekShellSorted listAnnaJimmySamualSandraVivekMergeSorted listAnnaJimmySamualSandraVivekمنبع