Strategy Pattern Nedir ?

Mennan Sevim
2 min readMay 14, 2020

--

Strategy tasarım deseni behavioral kategorisinde yer alan ve dofactory.com sitesine göre %80 oranına sahip basit bir tasarım desenidir.

Büyük bir uygulama tasarlamak, karmaşık bağlantı ve nesnelerin yönetilebilir olmasını gerektirir. OOP bunu yapmak için bir tasarım yeteneği sağlıyor elbette ancak OOP tarafından tasarlanan uygulamamızda bozulmaya yol açabilecek sorunlar ortaya çıkabilir.

Uzun ömürlü bir model elde etmek için bir tasarım desenine ihtiyacımız var.

Bu nedenle desenler, bu sorunların üstesinden gelebilmek için 1966 yılında Christopher Alexander tarafından mimari bir konsept olarak ortaya çıkmıştır.

Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides (Gang of Four) tarafından yazılan “Design Patterns: Elements of Reusable Object-Oriented Software” kitabına göre 24 ana tasarım deseni vardır.

Bu modellerin her biri belirli bir soruna bir dizi çözüm sunar, biz bu yazıda Strategy Pattern’i inceleyeceğiz.

Strategy Pattern,

if-else kullanarak pek tabi yapabileceğiniz işlemleri bir nevi toparlayan ve kullanımını sadeleştiren Open-Closed prensibine bağlı kabul görmüş bir tasarım çeşitidir.

Bu sayede bir değişiklik yapılması gerektiğinde tüm kodu gözden geçirmektense sadece ilgili sınıfımızla çalışırız.

Biraz yapısından bahsedeyim;

UML Diagramı

Context: Oluşturacağımız transfer nesnesi için kolaylık sağlayan wrapper yapımız

Strategy: Ortak kullanılacak bir çatı arayüz nesnemiz

ConcreteStrategy: Her bir algoritmayı gerçekleştirecek sınıfımız

Kitaplarda anlatılan teorik bilgilerden farklı olarak gerçek hayatta uyguladığımız bir örnek vermek istiyorum.

Rapor Sunucu adında bir uygulamamız var ve bu uygulamanın yeteneklerinden bazıları şarta ve zamana bağlı olarak müşterilere Sms / Pdf / Email göndermedir.

Yani burada çatı arayüzümüz ITransfer olabilir çünkü 3 işlemin de ortak eylemi gönderim yapmak.

Örnek Tasarım:

  1. Strategy

Arayüzümüzü aşağıdaki gibi tanımlayarak tasarıma başlıyoruz.

2. ConcreteStrategy

ITransfer arayüzümüzden 3 farklı algoritmamızı türetiyoruz ve Send metodlarını her bir sınıf için ayrı ayrı tasarlıyoruz.

Bu sayede Send metodu çağırıldığı nesneye bağlı olarak 3 farklı iş yapmış olacak. (SMS — PDF — EMAIL)

3. Context

Bu kısım ise aslında yazdığımız sınıflara tek bir yerden parametrik olarak erişebilmemizi sağlayan yani bir wrapper yapıdır ve bu ara sınıf ile yapılan istekleri tek bir çatıda toplamayı amaçlıyorum.

Tasarımı tamamlanan strategy’imizi aşağıdaki gibi çağırabiliriz.

Örnek projeyi github sayfamdan indirebilirsiniz.

--

--