اخبار، مطالب و رویدادهای مرتبط با توسعه نرم افزار رادکام

الگوی طراحی Strategy

الگوی Strategy یکی از الگوهای رفتاری می باشد. این الگو شامل مجموعه ای از الگوریتم ها  می باشد که برای یک عمل خاص مورد استفاده قرار می گیرد و هر کدام از آن ها نتایج یکسانی خواهد داشت. هر الگوریتم به صورت جداگانه در کلاسی پیاده سازی شده و کپسوله می شود که این امر امکان تعویض الگوریتم های مختلف را به ما خواهد داد. با استفاده از الگوی Strategy امکان تغییر دادن الگوریتم هنگام استفاده از آن ها و در زمان اجرا وجود خواهد داشت.

کاربردهای الگوی طراحی Strategy

الگوی Strategy را می توان در موارد زیر استفاده نمود:

  • در مواردی که چند روش برای پیاده سازی یک عمل خاص وجود دارد.
  • در مواردی که امکان انتخاب یک الگوریتم از بین چندین الگوریتم موجود توسط کاربر وجود دارد.

نمودار کلاس دیاگرام الگوی طراحی Strategy

همان طور که در دیاگرام مشخص است نمودار کلاس الگوی Strategy شامل کلاس های زیر است:Strategy Design Pattern

  • کلاس Context: در این کلاس اطلاعات ساختاری برای اشیاء Strategy نگهداری می شود و انتخاب نوع استراتژی توسط آن انجام می شود.
  • کلاس Strategy: در واقع یک Interface مشترک بین همه استراتژی های مورد نظر می باشد.
  • کلاس های ConcreteStrategy: کلاس هایی که هر کدام الگوریتم های متفاوت را پیاده سازی می نمایند و همه آن ها از کلاس Strategy ارث بری می کنند.

در ادامه، پیاده سازی این الگو را در یک مثال توضیح می دهیم:

فرض کنید میخواهید به مقصد خاصی بروید، برای انجام این کار می توانید از وسایل نقلیه مختلفی استفاده نمایید و میخواهید زمان رسیدن به مقصد با هر کدام از وسایل را بدانید، در این صورت می توانید از الگوی طراحی استراتژی برای محاسبه زمان رسیدن به مقصد استفاده نمایید.

ابتدا باید یک Interface به نام IStrategy به صورت زیر پیاده سازی نمود:


    public interface IStrategy {  
    string GetTravelTime(string source, string destination);  
}

فرض کنید سه نوع وسیله نقلیه وجود دارد، بنابراین می توانید هر کدام از آن ها را به صورت یک استراتژی پیاده سازی نمایید:


    public class CarStrategy: IStrategy {  
    public string GetTravelTime(string source, string destination) {  
        return "It takes 40 minutes to reach from " + source + " to " + destination + " using Car.";  
    }  
}  
public class BikeStrategy: IStrategy {  
    public string GetTravelTime(string source, string destination) {  
        return "It takes 25 minutes to reach from " + source + " to " + destination + " using Bike.";  
    }  
}  
public class BusStrategy: IStrategy {  
    public string GetTravelTime(string source, string destination) {  
        return "It takes 60 minutes to reach from " + source + " to " + destination + " using Bus.";  
    }  
}  

در نهایت، باید یک کلاس Context به صورت زیر پیاده سازی نمود که بتوان در هر زمان استراتژی مختلفی را انتخاب نمود:


    public class TravelStrategy {  
    private IStrategy _strategy;  
    public TravelStrategy(IStrategy chosenStrategy) {  
        _strategy = chosenStrategy;  
    }  
    public void GetTravelTime(string source, string destination) {  
        var result = _strategy.GetTravelTime(source, destination);  
        Console.WriteLine(result);  
    }  
}  


بنابراین در برنامه می توان پس از دریافت نوع وسیله نقلیه (استراتژی)، مدت زمان رسیدن به مقصد توسط آن وسیله نقلیه را محاسبه نمود:

void Main() {  
    Console.WriteLine("Hello!, Please select the mode of transport to get the travel time between source and destination: \nCar \nBike \nBus");  
    var userStrategy = Console.ReadLine().ToLower();  
    Console.WriteLine("\nUser has selected *" + userStrategy + "* as mode of transport\n");  
    Console.WriteLine("\n*****************************************************************************************************\n");  
    switch (userStrategy) {  
        case "car":  
            new TravelStrategy(new CarStrategy()).GetTravelTime("Point A", "Point B");  
            break;  
        case "bike":  
            new TravelStrategy(new BikeStrategy()).GetTravelTime("Point A", "Point B");  
            break;  
        case "bus":  
            new TravelStrategy(new BusStrategy()).GetTravelTime("Point A", "Point B");  
            break;  
        default:  
            Console.WriteLine("You have chosen an invalid mode of transport.");  
            break;  
    }  
} 

نام را وارد کنید
تعداد کاراکتر باقیمانده: 1000
نظر خود را وارد کنید