Strategy Pattern

Strategy Pattern, geliştiricilerin bir algoritma veya davranış ailesi tanımlamasına, her birini ayrı bir sınıfa yerleştirmesine ve bunları çalışma zamanında değiştirilebilir hale getirmesine olanak tanıyan davranışsal bir tasarım modelidir. Farklı davranışlar arasında seçim yapmak için büyük koşullu bloklar yazmak yerine Strategy Pattern, uygulamanın doğru strateji nesnesini seçmesine ve bunu ortak bir arayüz aracılığıyla kullanmasına olanak tanır.

Bu model, bir uygulamanın aynı görevi gerçekleştirmek için birden fazla yolu olduğunda Object-Oriented Programming'da çok kullanışlıdır. Örnekler arasında ödeme yöntemleri, indirim hesaplamaları, nakliye maliyeti kuralları, sıralama algoritmaları, dışa aktarma biçimleri, bildirim kanalları, validation kuralları ve fiyatlandırma stratejileri yer alır.

Giriş

Bu Design Patterns serisinin önceki makalelerinde Factory, Abstract Factory, Builder ve Prototype gibi yaratıcı modellerin yanı sıra Adapter, Decorator, Facade ve Repository gibi yapısal modelleri tartıştık. Bu modeller geliştiricilerin nesneler oluşturmasına, sistemleri birbirine bağlamasına ve kodu düzenlemesine yardımcı olur.

Strategy Pattern davranışsal Design Patterns kategorisine aittir. Davranış kalıpları, nesnelerin nasıl iletişim kurduğuna, sorumlulukların nasıl dağıtıldığına ve kodun sürdürülmesini zorlaştırmadan davranışın nasıl değişebileceğine odaklanır.

Strategy en pratik davranış kalıplarından biridir çünkü birçok gerçek uygulamanın farklı kurallar veya algoritmalar arasında geçiş yapması gerekir. Strategy Pattern olmadan bu mantık genellikle if ifadelerinin veya switch durumlarının uzun bir listesi haline gelir. Strategy Pattern ile her davranış kendi sınıfına yerleştirilerek kodun daha temiz ve genişletilmesi daha kolay hale gelir.

Strategy Pattern Nedir?

Strategy Pattern, bir grup değiştirilebilir davranış için ortak bir arayüz tanımlayan bir tasarım modelidir. Her davranış, strateji adı verilen ayrı bir sınıfta uygulanır. Çoğunlukla bağlam olarak adlandırılan ana sınıf, tam uygulama ayrıntılarını bilmeden stratejiyi arayüz aracılığıyla kullanır.

Basit bir ifadeyle Strategy Pattern, uygulamanın, davranışı kullanan sınıfı değiştirmeden bir şeyin nasıl yapılması gerektiğini seçmesine olanak tanır.

Örneğin bir e-ticaret uygulaması, düzenli müşteriler, premium müşteriler, sezonluk kampanyalar ve kupon kodları için indirimleri farklı hesaplayabilir. Tüm indirim kurallarını tek bir büyük yöntemin içine yerleştirmek yerine, her indirim kuralı ayrı bir strateji olarak uygulanabilir.

Strategy Pattern Neden Önemlidir?

Strategy Pattern önemlidir çünkü karmaşık koşullu mantığın azaltılmasına yardımcı olur. Birçok davranış, if veya switch ifadeleri kullanılarak tek bir sınıf içinde ele alındığında, sınıfın okunması, test edilmesi ve genişletilmesi zorlaşır.

Her yeni davranış eklendiğinde orijinal sınıfın değiştirilmesi gerekir. Bu, mevcut davranışı bozma riskini artırır. Strategy Pattern, aynı arayüzü izleyen yeni bir sınıf olarak yeni davranışın eklenmesine izin vererek bu sorunu çözer.

Bu, Açık Kapalı Prensibini destekler: yazılım genişletmeye açık, değişiklik için kapalı olmalıdır.

Strategy Pattern Olmadan Sorun

Teslimat yöntemine göre nakliye maliyetini hesaplayan bir uygulama düşünün. Strategy Pattern olmadan kod şöyle görünebilir:

class ShippingCalculator
{
    public function calculate(string $method, float $weight): float
    {
        if ($method === 'standard') {
            return $weight * 2;
        }

        if ($method === 'express') {
            return $weight * 5;
        }

        if ($method === 'international') {
            return $weight * 10 + 20;
        }

        throw new InvalidArgumentException('Invalid shipping method.');
    }
}

Bu kod işe yarar ancak daha fazla gönderim yöntemi eklendiğinde bakımı zorlaşır. ShippingCalculator sınıfı, her yeni yöntem tanıtıldığında değişmelidir.

Strategy Pattern her nakliye hesaplamasını kendi sınıfına taşır.

PHP'da Temel Strategy Pattern Örneği

İlk olarak ortak bir strateji arayüzü tanımlayın:

interface ShippingStrategy
{
    public function calculate(float $weight): float;
}

Şimdi somut strateji sınıfları oluşturun:

class StandardShippingStrategy implements ShippingStrategy
{
    public function calculate(float $weight): float
    {
        return $weight * 2;
    }
}

class ExpressShippingStrategy implements ShippingStrategy
{
    public function calculate(float $weight): float
    {
        return $weight * 5;
    }
}

class InternationalShippingStrategy implements ShippingStrategy
{
    public function calculate(float $weight): float
    {
        return ($weight * 10) + 20;
    }
}

Her strateji belirli bir nakliye hesaplama kuralı içerir. Kurallar ayrılmıştır ve test edilmesi daha kolaydır.

Bağlam Sınıfını Oluşturma

Bağlam sınıfı, stratejiyi arayüz aracılığıyla kullanır:

class ShippingCalculator
{
    public function __construct(
        private ShippingStrategy $strategy
    ) {
    }

    public function calculate(float $weight): float
    {
        return $this->strategy->calculate($weight);
    }
}

ShippingCalculator standart, ekspres veya uluslararası kargoyu kullanıp kullanmadığını bilmiyor. Yalnızca bir ShippingStrategy'ye sahip olduğunu biliyor.

Strategy Pattern'yu kullanma

Uygulama doğru stratejiyi seçip onu bağlama aktarabilir:

$strategy = new ExpressShippingStrategy();

$calculator = new ShippingCalculator($strategy);

$cost = $calculator->calculate(3.5);

Aynı ShippingCalculator, ShippingStrategy arayüzünü uygulayan herhangi bir stratejiyle çalışabilir.

Daha sonra yeni bir teslimat yöntemi eklenirse ShippingCalculator'da değişiklik yapılmadan yeni bir strateji sınıfı oluşturulabilir.

Strategy Pattern'nun Ana Parçaları

Strategy Pattern genellikle şu ana parçaları içerir:

  • Strategy arayüzü: Tüm stratejilerin uygulaması gereken ortak yöntemi tanımlar.

  • Somut stratejiler: Davranışın veya algoritmanın farklı versiyonlarını uygulayan sınıflar.

  • Bağlam: Davranışı gerçekleştirmek için bir strateji nesnesi kullanan sınıf.

  • Müşteri kodu: Doğru stratejiyi seçen veya sağlayan kod.

Bu yapı, davranış seçimini davranışın yürütülmesinden ayırır.

Gerçek Dünyadan Örnek: İndirim Strategysi

İndirim hesaplaması Strategy Pattern'nun en yaygın örneklerinden biridir. Farklı müşteriler veya kampanyalar farklı indirim kuralları kullanabilir.

interface DiscountStrategy
{
    public function calculate(float $total): float;
}

class NoDiscountStrategy implements DiscountStrategy
{
    public function calculate(float $total): float
    {
        return 0;
    }
}

class RegularCustomerDiscountStrategy implements DiscountStrategy
{
    public function calculate(float $total): float
    {
        return $total * 0.05;
    }
}

class PremiumCustomerDiscountStrategy implements DiscountStrategy
{
    public function calculate(float $total): float
    {
        return $total * 0.15;
    }
}

class SeasonalDiscountStrategy implements DiscountStrategy
{
    public function calculate(float $total): float
    {
        return $total * 0.25;
    }
}

Artık her indirim kuralı ayrı bir sınıfa yerleştirilmiştir. Bu, indirim davranışını eklemeyi, kaldırmayı veya değiştirmeyi kolaylaştırır.

İndirim Strategysini Kullanmak

class DiscountService
{
    public function __construct(
        private DiscountStrategy $strategy
    ) {
    }

    public function getFinalTotal(float $total): float
    {
        $discount = $this->strategy->calculate($total);

        return $total - $discount;
    }
}

$service = new DiscountService(new PremiumCustomerDiscountStrategy());

$finalTotal = $service->getFinalTotal(200);

İndirim Hizmetinin olası tüm indirim kurallarını içermesi gerekmez. Yalnızca seçilen stratejiyi kullanır.

Gerçek Dünyadan Örnek: Ödeme Strategysi

Ödeme sistemleri başka bir pratik kullanım durumudur. Bir uygulama, kredi kartı, PayPal, banka havalesi veya teslimatta nakit gibi farklı ödeme yöntemlerini destekleyebilir.

interface PaymentStrategy
{
    public function pay(float $amount): bool;
}

class CreditCardPaymentStrategy implements PaymentStrategy
{
    public function pay(float $amount): bool
    {
        // Pay by credit card
        return true;
    }
}

class PayPalPaymentStrategy implements PaymentStrategy
{
    public function pay(float $amount): bool
    {
        // Pay by PayPal
        return true;
    }
}

class BankTransferPaymentStrategy implements PaymentStrategy
{
    public function pay(float $amount): bool
    {
        // Pay by bank transfer
        return true;
    }
}

Her ödeme yönteminin kendi stratejisi vardır. Ödeme işlemi aynı arayüz üzerinden herhangi bir ödeme stratejisini kullanabilir.

Ödeme Strategysi ile Ödeme

class CheckoutService
{
    public function __construct(
        private PaymentStrategy $paymentStrategy
    ) {
    }

    public function checkout(float $amount): bool
    {
        return $this->paymentStrategy->pay($amount);
    }
}

$checkout = new CheckoutService(new PayPalPaymentStrategy());

$checkout->checkout(150);

Bu tasarım, CheckoutService'i yeniden yazmaya gerek kalmadan daha sonra yeni ödeme yöntemleri eklemeyi kolaylaştırır.

Çalışma Zamanında Strategy SELECTk

Gerçek uygulamalarda seçilen strateji, kullanıcı girişine, yapılandırmaya, database değerlerine, istek parametrelerine veya iş kurallarına bağlı olabilir.

Doğru stratejiyi seçmek için basit bir fabrika kullanılabilir:

class PaymentStrategyFactory
{
    public function create(string $method): PaymentStrategy
    {
        return match ($method) {
            'credit_card' => new CreditCardPaymentStrategy(),
            'paypal' => new PayPalPaymentStrategy(),
            'bank_transfer' => new BankTransferPaymentStrategy(),
            default => throw new InvalidArgumentException('Invalid payment method.'),
        };
    }
}

Factory Pattern doğru Strategy nesnesini oluşturabilir ve Strategy Pattern davranışı işler. Bu iki model çoğu zaman birlikte iyi çalışır.

Strategy Pattern ile Dependency Injection

Strategy Pattern bağımlılık enjeksiyonuyla iyi çalışır. Bağlam sınıfının içinde bir strateji oluşturmak yerine strateji dışarıdan iletilir.

Bu, bağlam sınıfının test edilmesini ve yapılandırılmasını kolaylaştırır. Testler sırasında geliştiriciler sahte bir stratejiyi aktarabilirler. Üretimde uygulama, konfigürasyona veya kullanıcı seçimine göre seçilen gerçek stratejiyi geçebilir.

class ExportService
{
    public function __construct(
        private ExportStrategy $strategy
    ) {
    }

    public function export(array $data): string
    {
        return $this->strategy->export($data);
    }
}

ExportService bir soyutlamaya dayanır ve somut dışa aktarma formatlarından bağımsız kalır.

Gerçek Dünyadan Örnek: İhracat Strategysi

Bir uygulama, verileri PDF, Excel, CSV veya JSON gibi farklı formatlarda dışa aktarabilir. Her format farklı mantık gerektirir.

interface ExportStrategy
{
    public function export(array $data): string;
}

class PdfExportStrategy implements ExportStrategy
{
    public function export(array $data): string
    {
        return 'PDF export content';
    }
}

class CsvExportStrategy implements ExportStrategy
{
    public function export(array $data): string
    {
        return 'CSV export content';
    }
}

class JsonExportStrategy implements ExportStrategy
{
    public function export(array $data): string
    {
        return json_encode($data);
    }
}

Tüm dışa aktarma mantığını tek bir sınıfa yerleştirmek yerine her formatın kendi stratejisi vardır. Bu, sürdürülebilirliği artırır ve her dışa aktarma biçiminin test edilmesini kolaylaştırır.

Laravel'da Strategy Pattern

Laravel uygulamalarında Strategy Pattern, ödeme ağ geçitleri, indirim kuralları, gönderim yöntemleri, bildirim kanalları, dosya aktarıcılar, validation kuralları ve rapor oluşturucular için kullanışlıdır.

Laravel'nun hizmet kapsayıcısı, yapılandırmaya dayalı bir strateji uygulamasını enjekte edebilir. Örneğin, bir servis sağlayıcı bir arayüzü belirli bir stratejiye bağlayabilir:

$this->app->bind(
    PaymentStrategy::class,
    PayPalPaymentStrategy::class
);

İstek verilerine dayalı dinamik seçim için bir fabrika veya çözümleyici sınıfı doğru stratejiyi seçip bunu hizmete iletebilir.

Laravel Strategy Çözümleyici Örneği

class PaymentStrategyResolver
{
    public function resolve(string $method): PaymentStrategy
    {
        return match ($method) {
            'credit_card' => app(CreditCardPaymentStrategy::class),
            'paypal' => app(PayPalPaymentStrategy::class),
            'bank_transfer' => app(BankTransferPaymentStrategy::class),
            default => throw new InvalidArgumentException('Invalid payment method.'),
        };
    }
}

Bu, denetleyiciyi temiz tutar. Denetleyici, ödeme seçimi mantığını içermek yerine çözümleyiciden doğru stratejiyi isteyebilir.

Symfony'da Strategy Pattern

Symfony uygulamaları, hizmetler ve bağımlılık ekleme yoluyla Strategy Pattern'yu kullanabilir. Farklı strateji sınıfları hizmet olarak kaydedilebilir ve çözümleyici, yapılandırmaya veya çalışma zamanı girişine göre doğru olanı seçebilir.

Symfony etiketleri aynı zamanda birden fazla strateji hizmetini toplamak ve bunları anahtara göre düzenlemek için de kullanılabilir. Bu, stratejilerin büyük bir fabrika sınıfını değiştirmeden genişletilmesi gereken büyük uygulamalarda kullanışlıdır.

Strategy Pattern, Symfony hizmet mimarisiyle doğal olarak uyum sağlar ve business logicnı temiz tutmaya yardımcı olur.

Strategy Pattern ve Açık Kapalı Prensibi

Strategy Pattern Açık Kapalı Prensibini güçlü bir şekilde destekler. Bağlam sınıfı, yeni stratejiler eklendiğinde değişmesine gerek olmadığından değişiklik için kapatılmıştır. Geliştiriciler yeni strateji sınıfları ekleyebildiği için sistem genişlemeye açık kalıyor.

Örneğin, bir uygulama PDF ve CSV dışa aktarmayı destekliyorsa, aynı arayüzü uygulayan bir ExcelExportStrategy sınıfı oluşturularak Excel dışa aktarımının eklenmesi yapılabilir. ExportService'in değişmesine gerek yoktur.

Bu, tasarımı daha güvenli hale getirir ve zaman içinde bakımı daha kolay hale getirir.

Strategy Pattern ve Polimorfizm

Strategy Pattern büyük ölçüde polimorfizme bağlıdır. Tüm strateji sınıfları aynı arayüzü uygular ancak her sınıf farklı davranışlar sağlar.

Bağlam sınıfı arayüzü kullanır ve gerçek davranış, çalışma zamanında iletilen somut strateji nesnesine bağlıdır.

Bu, gerçek yazılım tasarımındaki polimorfizmin pratik bir örneğidir. Aynı yöntem çağrısı, seçilen stratejiye bağlı olarak farklı sonuçlar üretebilir.

Strategy Pattern vs Factory Pattern

Strategy Pattern ve Factory Pattern farklıdır ancak sıklıkla birlikte kullanılırlar.

Factory Pattern nesne oluşturmaya odaklanır. Hangi nesnenin yaratılması gerektiğine karar verir. Strategy Pattern davranışa odaklanır. Değiştirilebilir algoritmaları veya kuralları tanımlar.

Örneğin, bir PaymentStrategyFactory, bir PayPalPaymentStrategy oluşturabilir. Factory yaratmayı yönetirken, strateji de ödeme davranışını yönetir.

Kısaca Factory stratejiyi yaratır, Strategy ise davranışı gerçekleştirir.

Strategy Pattern vs Durum Modeli

Strategy Pattern ve Durum Deseni benzer görünebilir çünkü her ikisi de değiştirilebilir nesneler kullanır. Ancak onların niyeti farklıdır.

Strategy Pattern, istemcinin veya uygulamanın bir algoritma veya davranış seçmesine olanak tanır. Seçilen strateji genellikle ödeme yöntemi, indirim türü veya dışa aktarma biçimi gibi bir seçeneği temsil eder.

Durum Deseni, bir nesnenin iç durumuna bağlı olarak davranışı değiştirir. Örneğin bir sipariş beklemedeyken, ödendiğinde, gönderildiğinde veya iptal edildiğinde farklı davranabilir.

Kısacası, Strategy davranışı seçmekle ilgilidir, Durum ise bir nesne durumlar arasında hareket ettikçe davranışı değiştirmekle ilgilidir.

Strategy Pattern vs Template Method Pattern

Template Method Pattern, alt sınıfların belirli adımları özelleştirmesine izin verirken, bir üst sınıftaki bir algoritmanın yapısını tanımlamak için kalıtımı kullanır.

Strategy Pattern, tüm davranışları birbirinin yerine kullanılabilir hale getirmek için kompozisyon ve arayüzleri kullanır.

Strategy genellikle daha esnektir çünkü stratejiler çalışma zamanında değiştirilebilir. Şablon Yöntemi, algoritma yapısının sabit olduğu ve yalnızca belirli adımların değiştiği durumlarda kullanışlıdır.

Strategy Pattern'nun Faydaları

Strategy Pattern, nesne yönelimli yazılım tasarımında birçok fayda sağlar.

Ana faydalar şunları içerir:

  • Büyük if ve switch ifadelerini azaltır.

  • Farklı algoritmaları odaklanmış sınıflara ayırır.

  • Davranışın bağımsız olarak test edilmesini kolaylaştırır.

  • Açık Kapalı Prensibini destekler.

  • Çalışma zamanı davranışı seçimine izin vererek esnekliği artırır.

  • Bağımlılık enjeksiyonu ve arayüzlerle iyi çalışır.

  • Okunabilirliği ve sürdürülebilirliği artırır.

  • Yeni davranış eklemeyi daha güvenli ve temiz hale getirir.

Bu avantajlar Strategy Pattern'yu en kullanışlı davranışsal Design Patternsnden biri haline getiriyor.

Strategy Pattern'nun dezavantajları

Strategy Pattern'nun dezavantajları da olabilir. Her davranışın genellikle kendi sınıfına ihtiyacı olması nedeniyle projedeki sınıf sayısını artırabilir.

Yalnızca bir veya iki küçük koşula sahip basit mantık için Strategy Pattern gereksiz olabilir. Çok küçük bir sorun için arayüzler ve birçok sınıf eklemek, kodun anlaşılmasını zorlaştırabilir.

Diğer bir dezavantaj ise müşteri kodunun veya çözümleyicinin doğru stratejiyi seçmesinin gerekmesidir. Strategy seçim mantığı karmaşık hale gelirse bir fabrikada veya çözümleyicide dikkatli bir şekilde organize edilmelidir.

Strategy Pattern Ne Zaman Kullanılır?

Bir uygulamanın aynı görevi gerçekleştirmek için birden fazla yolu varsa ve bu davranışlar zamanla değişebiliyor veya büyüyebiliyorsa Strategy Pattern'yu kullanın.

Strategy Pattern şu durumlarda faydalıdır:

  • Aynı işlem için birden fazla algoritmanız var.

  • Büyük koşullu bloklardan kaçınmak istiyorsunuz.

  • Davranış çalışma zamanında seçilmelidir.

  • İlerleyen zamanlarda yeni davranışlar eklenebilir.

  • Her davranışı ayrı ayrı test etmek istiyorsunuz.

  • Ana sınıf tüm uygulama ayrıntılarını bilmemelidir.

  • Arayüz tabanlı tasarımı takip etmek istiyorsunuz.

Bu koşullar mevcutsa Strategy Pattern tasarımı önemli ölçüde iyileştirebilir.

Strategy Pattern Ne Zaman Kullanılmamalı?

Davranışın basit olduğu ve değişme ihtimalinin düşük olduğu durumlarda Strategy Pattern kullanmayın. Yalnızca bir algoritma varsa veya koşullar çok küçükse doğrudan kod daha net olabilir.

Aşağıdaki durumlarda Strategy Pattern'dan kaçının:

  • Yalnızca bir davranış uygulaması vardır.

  • Mantık ekstra sınıfları haklı çıkarmayacak kadar basittir.

  • Desen, projede gezinmeyi zorlaştırır.

  • Davranışın dinamik olarak değişmesi gerekmez.

  • Basit bir yöntem veya konfigürasyon değeri yeterlidir.

Design Patterns kodu daha karmaşık değil, daha temiz hale getirmelidir.

Strategy Pattern ile Yapılan Yaygın Hatalar

Yaygın bir hata, ayrı sınıflara ihtiyaç duymayan çok küçük farklılıklar için stratejiler oluşturmaktır. Bu gereksiz karmaşıklık yaratabilir.

Diğer bir hata ise strateji seçim mantığını bağlam sınıfının içine yerleştirmektir. Bağlam stratejiyi kullanmalı, onu seçmek için büyük bir switch ifadesi içermemelidir.

Üçüncü bir hata ise strateji arayüzlerini çok geniş tutmaktır. Bir strateji arayüzü yalnızca tüm stratejilerin gerçekten paylaştığı davranışı tanımlamalıdır.

Dördüncü hata, iş iş akışlarını strateji mantığıyla karıştırmaktır. Her strateji değiştirilebilir bir davranışa odaklanmalıdır.

Strategy Pattern için En İyi Uygulamalar

Strategy Pattern'yu etkili bir şekilde kullanmak için geliştiricilerin stratejileri odaklanmış, net ve değiştirilmesi kolay tutması gerekir.

Yararlı en iyi uygulamalar şunları içerir:

  • Küçük ve anlaşılır bir strateji arayüzü tanımlayın.

  • Her stratejiyi tek bir davranışa odaklayın.

  • Strategyler sağlamak için bağımlılık enjeksiyonunu kullanın.

  • Gerektiğinde stratejiler seçmek için bir fabrika veya çözümleyici kullanın.

  • Strategy seçim mantığını bağlam sınıfının içine koymaktan kaçının.

  • PayPalPaymentStrategy veya PremiumDiscountStrategy gibi anlamlı adlar kullanın.

  • Her stratejiyi bağımsız olarak test edin.

  • Basit koşullar için Strategy Pattern'yu aşırı kullanmayın.

Bu uygulamalar Strategy Pattern'nun pratik ve bakımı kolay kalmasına yardımcı olur.

Strategy Pattern Kullanmadan Önce Pratik Kontrol Listesi

Strategy Pattern'yu kullanmadan önce geliştiriciler şu soruları sorabilir:

  • Aynı görevi gerçekleştirmek için birden fazla yolum var mı?

  • Mevcut kod if veya switch ifadeleriyle dolu mu?

  • Daha sonra yeni davranışlar eklenecek mi?

  • Davranış çalışma zamanında mı seçilmeli?

  • Her davranış ayrı ayrı test edilebilir mi?

  • Bir arayüz tasarımı daha temiz hale getirecek mi?

  • Ekstra yapı esnekliğe değer mi?

Bu soruların birçoğunun cevabı evet ise Strategy Pattern iyi bir tasarım tercihi olabilir.

Sonuç

Strategy Pattern, geliştiricilerin değiştirilebilir algoritmalar veya davranışlar tanımlamasına ve ana uygulama kodunu değiştirmeden bunlar arasında geçiş yapmasına olanak tanıyan davranışsal bir tasarım modelidir. Özellikle ödeme yöntemleri, indirim kuralları, gönderim hesaplamaları, dışa aktarma biçimleri, validation kuralları ve diğer davranış değişiklikleri için kullanışlıdır.

Strategy Pattern, büyük koşullu blokları odaklanmış strateji sınıflarıyla değiştirerek kod organizasyonunu geliştirir. Polimorfizmi, bağımlılık enjeksiyonunu, clean code'yu ve Açık Kapalı Prensibini destekler.

Ancak Strategy Pattern yalnızca davranış değişiminin gerçek ve anlamlı olduğu durumlarda kullanılmalıdır. Basit mantık açısından gereksiz karmaşıklık katabilir. Doğru uygulandığında Strategy Pattern esnek, bakımı yapılabilir ve ölçeklenebilir nesne yönelimli yazılım oluşturmaya yönelik en güçlü araçlardan biridir.