الگوی استراتژی (Strategy) اجازه میدهد که یک الگوریتم در یک کلاس بسته بندی شود و در زمان اجرا برای تغییر رفتار یک شیئ تعویض شود.برای مثال فرض کنید که ما در حال طراحی یک برنامه مسیریابی برای یک شبکه هستیم. همانطوریکه میدانیم برای مسیر یابی الگوریتمهای مختلفی وجود دارد که هر کدام دارای مزایا و معایبی هستند. و با توجه به وضعیت موجود شبکه یا عملی که قرار است انجام پذیرد باید الگوریتمی را که دارای بالاترین کارائی است انتخاب کنیم. همچنین این برنامه باید امکانی را به کاربر بدهد که کارائی الگوریتمهای مختلف را در یک شبکه فرضی بررسی کنید. حالا طراحی پیشنهادی شما برای این مسئله چست؟
دوباره فرض کنید که در مثال بالا در بعضی از الگوریتمها نیاز داریم که گرههای شبکه را بر اساس فاصلهی آنها از گره مبداء مرتب کنیم. دوباره برای مرتب سازی الگوریتمهای مختلف وجود دارد و هر کدام در شرایط خاص، کارائی بهتری نسبت به الگوریتمهای دیگر دارد. مسئله دقیقا شبیه مسئله بالا است و این مسله میتوانند دارای طراحی شبیه مسله بالا باشد. پس اگر ما بتوانیم یک طراحی خوب برای این مسئله ارائه دهیم میتوانیم این طراحی را برای مسائل مشابه به کار ببریم.
هر کدام از ما میتوانیم نسبت به درک خود از مسئله و سلیقه کاری، طراحهای مختلفی برای این مسئله ارائه دهیم. اما یک طراحی که میتواند یک جواب خوب و عالی باشد، الگوی استراتژی است که توانسته است بارها و بارها به این مسئله پاسخ بدهد.
الگوی استراتژی گزینه مناسبی برای مسائلی است که میتوانند از چندین الگوریتم مختلف به مقصود خود برسند.
نمودار UML الگوی استراتژی به صورت زیر است :
اجازه بدهید، شیوه کار این الگو را با مثال مربوط به مرتب سازی بررسی کنیم. فرض کنید که ما تصمیم گرفتیم که از سه الگویتم زیر برای مرتب سازی استفاده کنیم.
3 - الگوریتم مرتب سازی Merge Sort
ما برای مرتب سازی در این برنامه دارای سه استراتژی هستیم. که هر کدام را به عنوان یک کلاس جداگانه در نظر میگیریم (همان کلاسهای ConcreteStrategy ). برای اینکه کلاس Client بتواند به سادگی یک از استراتژیها را انتخاب کنید بهتر است که تمام کلاسهای استراتزی دارای اینترفیس مشترک باشند. برای این کار میتوانیم یک کلاس abstract تعریف کنیم و ویژگیهای مشترک کلاسهای استراتژی را در آن قرار دهیم و کلاسهای استراتژی آنها را به ارث ببرند(همان کلاس Strategy ) و پیاده سازی کنند.
در زیل کلاس Abstract که کل کلاسهای استراتژی از آن ارث میبرند را مشاهده میکنید :
abstract class SortStrategy { public abstract void Sort(ArrayList list); }
class QuickSort : SortStrategy { public override void Sort(ArrayList list) { // الگوریتم مربوطه }
}
کلاس مربوط به ShellSort
class ShellSort : SortStrategy { public override void Sort(ArrayList list) { // الگوریتم مربوطه } }
class MergeSort : SortStrategy { public override void Sort(ArrayList list) { // الگوریتم مربوطه } }
class SortedList { private ArrayList list = new ArrayList(); 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); } }