Strategy tasarım deseni, bir algoritma ailesi tanımlamamızı, her birini ayrı bir sınıfa koymamızı ve nesnelerinin birbiriyle değiştirilebilir hale getirmenizi sağlayan davranışsal bir tasarım modelidir.
Bir işlemin birden fazla yapılması, çalışma zamanında algoritma değişikliği gibi durumlarda kullanılır, karışık if-else durumundan da kurtarır. Soyutlamadan dolayı da Loosely Coupled bir uygulama halini alır.
Senaryo olarak e-ticaret projesinin ödeme kısmını düşünelim. Ödeme metotları arasında; kredi kartı, Paypal gibi seçenekler mevcuttur.
C# Kod Örneği:
// UML diyagramındaki Strategy arayüzüne denk gelmektedir.// Benzer işlemleri yapan sınıflar bu arayüzden türeyecektir.interfaceIPayment{voidPay(int amount);}
// UML diyagramındaki ConcreteStrategy sınıfına denk gelmektedir.// UML diyagramındaki Strategy arayüzüne denk gelen arayüzü uyguluyor.classPaypalPayment:IPayment{privatestring _email;privatestring _password;publicPaypalPayment(string email,string password) { _email = email; _password = password; }publicvoidPay(int amount) { // Kredi kartı ödeme işlemlerinin gerçekleştiği yer.Console.WriteLine("Paid by Paypal."); }}
// Sepette bulunan ürünleri temsil eden sınıf.// Ürün kodu ve fiyat bilgisi temel olarak yeterlidir.classItem{privatestring _upcCode;privateint _price;publicItem(string upcCode,int price) { _upcCode = upcCode; _price = price; }publicintGetPrice() {return _price; }}
// UML diyagramındaki Context sınıfına denk gelmektedir.// UML diyagramındaki Strategy(IPayment) arayüzüne ait referansı tutmaktadır.classShoppingCart{privateList<Item> _items;privateIPayment _payment;publicShoppingCart() { _items =newList<Item>(); }publicvoidSetPaymentMethod(IPayment payment) { _payment = payment; }publicvoidAddItem(Item item) {_items.Add(item); }publicintCalculateTotal() {int sum =0;foreach (Item item in _items) { sum +=item.GetPrice(); }return sum; }publicvoidPay() {int amount =CalculateTotal();_payment.Pay(amount); }}
ShoppingCart shoppingCart =newShoppingCart();shoppingCart.AddItem(newItem("894651364",80));shoppingCart.AddItem(newItem("654798243",20));shoppingCart.SetPaymentMethod(newPaypalPayment("yusufyilmazfr@gmail.com","examplepassword"));shoppingCart.Pay(); // output: Paid by Paypal.shoppingCart.SetPaymentMethod(newCreditCartPayment("Julia Rodriguez","4373093149845972","199","12/2024"));shoppingCart.Pay(); // output: Paid by credit cart.