Strategy Pattern bir algoritmanın o algoritmayı içinde barındıracak olan class'tan ayrılması ve ayrı classlar olarak kapsüllenmesi demektir. Daha da basitleştirecek olursak class ve algoritmayı ayırmaktır, böylece class'a bağımlı olmadan istediğiniz zaman çalışma anında algoritmayı değiştirebilirsiniz.
Strategy Pattern kullanarak birden fazla davranış göstermesini istediğiniz nesneleriniz varsa bütün davranışları ayrı bir class haline getirerek projenin takip edilebilirliğini artırabilirsiniz. Temelde aynı ancak farklı davranışlar gösteren nesnelerle çalışacaksanız Strategy Pattern çok uygun bir kalıp.
Strateji kullanarak aynı zamanda bir çok kontrol mekanizması kullanmaktan da kurtulursunuz. Bir çok davranışın bir class içerisinde olduğunu var sayarsak hangi davranışın seçileceğini belirlemek için kontrol mekanizmalarına başvurmak zorunda kalırız.
Bir strateji oyunu tasarlayacak olursak; Örneğin 2 tane asker tipi olsun.

Saldır metodu taban sınıf içerisinde çünkü iki asker tipi de saldırabiliyor. Askerlerin görünüşleri farklı olacağı için ikisininde kendi göster metotları mevcut.
Bir süre sonra oyunumuza yeni bir karakter ekleyerek geliştirmek istiyoruz ve yaralanan askerleri iyileştirmek için büyücü eklemeye karar veriyoruz. Burada bir problem var, büyücüler diğer askerler gibi saldıramıyor.

Diğer iki askere yaptığımız gibi büyücüyü de taban sınıftan türetirsek bu sefer büyücüler de saldırabiliyor olacak. Bizim senaryonumuzda büyücüler saldıramazlar. İlk akla gelen taban sınıftaki Saldir metodunu virtual yapmak ve Büyücü sınıfında metodu override edip içini boş bırakmak. Ancak o zaman da modellememiz yukarıdaki gibi görünmeye başlıyor. Saldıramayan büyücülerin içerisinde bile Saldır metodu var. Kodların zamanla daha da gelişeceğini düşünürsek şimdiden bizi zor günlerin beklediğini söylemek yanlış olmaz. Çünkü işin sonunda davranışı farklı olan tüm karakterler için tekrar eden işe yaramaz kodlar yazmak zorunda kalacağız. Tıpkı büyücü içinde Saldır metodunu override edip içini boş bırakmamız gibi. Şöyle yapsak nasıl olur? Saldır metodunu taban sınıfın içerisinden alıp bir interface içerisine koyalım ve saldırabilen tüm birimler de onu implemente edelim.

Bu biraz daha temiz bir koda benziyor ancak oyunu daha da geliştirip askerlerin farklı saldırı tiplerine sahip olmalarını istersek sadece sorunu başkalaştırdık. Okçu ve Şövalye için aynı saldırı tipini kullanmış olduk. Değişiklik gösteren kısmın askerlerin nasıl saldırdıkları olduğunu burada açıkça görebiliyoruz. Saldırı tipi bir algoritma ancak çalışma anında saldırı biçimin değiştirilebilmesi hatta upgrade edilebilmesi ise asıl sorun.
Bu durumda saldırı mantığını taban sınıftan ayıralım ve saldırı şekillerini kendi başlarına birer class haline getirerek Strategy Pattern'i uygulamaya başlayalım.
.jpg)
Artık classlarımızın davranış biçimleri onlardan tamamen ayrı halde. Askerlerimiz için ayrı saldırı şekilleri belirleyebiliriz. Yeni bir asker ekleyebilir ona özgü hareketleri ise ISaldırabilir interface'ini bir class' a implemente edip kullanabiliriz ve setSaldiriSekli(ISaldirabilir saldiriSekli) metodu ile de çalışma anında saldırı tipini ve şeklini değiştirebiliriz. Büyücüler ise saldırı şekli olarak Saldırma class'ını kullanacak ve böylece biz istemediğimiz sürece saldıramayacaklar.