Design Pattern Dersleri #2 — Strategy Pattern (Golang)
Strateji Deseni (Strategy Pattern) nerede kullanılır? Kullanımındaki püf noktaları golang dilinde inceleyeceğimiz yazıya hoş geldiniz.
Strateji Deseni Nedir
Strateji Deseni davranışsal bir tasarım desenidir. Farklı sınıfların aynı amaç için kullanılan fonksiyonları varsa strateji deseni kullanılabilir.
Örneğin;
- İki farklı depolama veya şifreleme sınıfınız varsa ve tek noktadan bunları kullanmak istiyorsanız,
- Benzer özelliklere sahip farklı istemcileri ortak bir noktadan kullanmak istiyorsanız kullanmak avantajlı olacaktır.
Avantajları
- Yeni sınıflar için standart kullanım sağlamak,
- Yazılımsal bağımlılıklardan kurtulabilmek,
- Kolaylıkla Yeni bir yöntemi veya cihazı entegre edebilmek.
PHP ile örnek çalışma hafta içerisinde başka bir yazı altında paylaşılacaktır.
Örnek Çalışma
Strateji Pattern için şöyle bir örnek planladım:
Farklı modellerdeki temizlik robotlarına hazırlayacağımız sistem üzerinden bağlantı kurduğumuzu hayal edelim. Sistem üzerinden görev dağılımı yapabilecek(Bu ileriki derslerde optimize edilecektir) ve bu farklı robotların benzer amaçlar ile çalışan fonksiyonlarını sisteme entegre etmemiz gerekecek. İşte tam burada strateji desenini kullanabilmekteyiz.
Öncelikle Temel Fonksiyonlarımız nelerdir onlara bakalım.
Robotlarımız temizleme, bir noktaya gitme, şarj olma ve şarj durum bilgisi paylaşma gibi genel fonksiyonlara sahip olduklarını planlıyoruz. Bunun için bir ara yüz (interface) tasarlıyoruz.
Sonrasında robotlarımızı bu ara yüze bağlı olarak geliştiriyoruz.
Robot V1
RobotV2
Bu noktada şarjDurumu fonksiyonumuza bakarsak robotV1 BatteryStatus değerini float olarak tutarken, robotV2 batteryRate durumunu integer olarak tutmaktadır.
Sonrasında…
Oluşturduğumuz bu ara yüzü, değişken olarak dahil ettiğimiz bir sınıf oluşturmamız gerekiyor.
ve bu oluşturduğumuz sınıf (golang’de sınıflar olmadığı için yapı dememiz daha doğru olur) için temel fonksiyonları oluşturuyoruz.
Yukarıdaki kod parçasında görüldüğü gibi yapımız içerisindeki robot değişkeni tanımlamamıza göre RobotV1 veya RobotV2 nesnesini içerebilmektedir. Bu sayede RobotV1 ve V2'nin özel fonksiyonlarını yapımız içerisinde kullanabildik. Artık kullanım sırasında RobotV1'in özel yapıları nasıl çalışır gibi bilgileri bilmeden de kullanabileceğiz ve herhangi bir durumda RobotV1 modelin yerine RobotV2 model bir robotu anlık olarak atayabileceğiz.
Son olarak kullanım kısmına bakalım
Not: Örneğimizde Strateji desenini kullanmaya öncelik verdiğimiz için asenkron multi-task çalışma üzerine bir örnek yapılmamıştır. Bu durumu istek olursa başka bir yazıda inceleyebiliriz.
Alameddin Çelik