
الگوی طراحـــــــــی Strategy
الگوی طراحی Strategy یک الگوی رایج در برنامهنویسی است که برای تعریف مجموعهای از الگوریتمها یا روشها و انتخاب یکی از آنها بر اساس نیاز، استفاده میشود. این الگو اجازه میدهد که الگوریتمها از برنامه اصلی جدا شوند و اجازه میدهد که روشهای مختلفی برای انجام یک عملیات مشخص وجود داشته باشد.
مفهوم الگوی Strategy به این صورت است که ما یک کلاس Context داریم که از یک رابط یا کلاس استراتژی (Strategy) تبعیت میکند و از آن به عنوان یک ویژگی استفاده میکند. همچنین کلاس Strategy نیز وجود دارد که الگوریتمها یا روشهای مختلف را تعریف میکند و رابطی است که Context از آن استفاده میکند.
از الگوی Strategy زمانی استفاده میشود که:
- میخواهیم چندین الگوریتم یا روش مشابه را برای یک عملیات خاص داشته باشیم و بتوانیم بین آنها انتخاب کنیم.
- میخواهیم رفتارها را از برنامه اصلی جدا کنیم و یک راه سادهتر برای تغییر آنها در آینده داشته باشیم.
میخواهیم از اصول "Open/Closed" و "Single Responsibility" در طراحی برنامهمان پیروی کنیم.
برای درک بهتر این الگو، با یک مثال ملموس و کاربردی در دنیای واقعی آشنا میشویم:
فرض کنید ما یک برنامه فرمول یک داریم که برای مسابقات بهینهسازی مدل ماشینهای خودروها استفاده میکند. در این برنامه، مدلهای مختلفی از ماشینها وجود دارند که با توجه به ویژگیهای مختلف، عملکرد و قابلیتهای متفاوتی دارند. همچنین الگوریتمهای مختلفی برای بهینهسازی هر مدل ماشین ممکن است وجود داشته باشد. در اینجا از الگوی Strategy برای جداسازی الگوریتمها و بهینهسازیها برای هر مدل ماشین استفاده میکنیم.
حالا بیایید کد مربوط به این مثال را در زبان سی شارپ بنویسیم:
1. Strategy:
1public interface ICarOptimizationStrategy
2{
3 void OptimizeCarPerformance();
4}
2. ConcreteStrategy:
1public class StreetCarOptimizationStrategy : ICarOptimizationStrategy
2{
3 public void OptimizeCarPerformance()
4 {
5 Console.WriteLine("Optimizing performance for street car.");
6 // الگوریتم بهینهسازی برای مدل ماشین خاص
7 }
8}
9
10public class RacingCarOptimizationStrategy : ICarOptimizationStrategy
11{
12 public void OptimizeCarPerformance()
13 {
14 Console.WriteLine("Optimizing performance for racing car.");
15 // الگوریتم بهینهسازی برای مدل ماشین خاص
16 }
17}
18
19public class OffRoadCarOptimizationStrategy : ICarOptimizationStrategy
20{
21 public void OptimizeCarPerformance()
22 {
23 Console.WriteLine("Optimizing performance for off-road car.");
24 // الگوریتم بهینهسازی برای مدل ماشین خاص
25 }
26}
3. Context:
1public class CarOptimizer
2{
3 private ICarOptimizationStrategy _strategy;
4
5 public void SetOptimizationStrategy(ICarOptimizationStrategy strategy)
6 {
7 _strategy = strategy;
8 }
9
10 public void OptimizeCar()
11 {
12 _strategy.OptimizeCarPerformance();
13 }
14}
4. Client (کلاینت):
1public class Program
2{
3 public static void Main()
4 {
5 CarOptimizer optimizer = new CarOptimizer();
6
7 // بهینهسازی ماشین جادهای
8 optimizer.SetOptimizationStrategy(new StreetCarOptimizationStrategy());
9 optimizer.OptimizeCar();
10
11 // بهینهسازی ماشین مسابقهای
12 optimizer.SetOptimizationStrategy(new RacingCarOptimizationStrategy());
13 optimizer.OptimizeCar();
14
15 // بهینهسازی ماشین آفرود
16 optimizer.SetOptimizationStrategy(new OffRoadCarOptimizationStrategy());
17 optimizer.OptimizeCar();
18 }
19}
خروجی برنامه به صورت زیر خواهد بود:
Optimizing performance for street car.
Optimizing performance for racing car.
Optimizing performance for off-road car.
در این مثال، با استفاده از الگوی Strategy، ما یک برنامه بهینهسازی مدلهای ماشینها ایجاد کردیم. هر مدل ماشین میتواند بهینهسازیهای مختلفی داشته باشد که این بهینهسازیها به صورت پویا و تغییرپذیر انتخاب میشوند. با این روش، ما از برنامهاصلی الگوریتمها و بهینهسازیها جدا شدهایم و اجازه میدهد که به راحتی از الگوریتمهای جدید و بهینهسازیهای مختلف برای هر مدل ماشین استفاده کنیم.