CodeBlanks Logo Icon CodeBlanks

Strategy

Strategy deseniyle algoritma ailesini öğrenirsin.

Strategy deseni nedir?

Strategy, bir işi yapan algoritmaları bir arayüz arkasına encapsulate eder ve çalışma zamanında değiştirilebilir kılar. Aynı görevi yapan birden çok yöntem varsa ve hangisinin kullanılacağına çalışma anında karar veriliyorsa Strategy uygun olur.

C++'ta bir Strategy soyut sınıfı tanımlarsın; her algoritma bunun bir alt sınıfı olur. Context sınıfı bir Strategy işaretçisi tutar ve setStrategy ile değiştirebilir. Örnek: sıralama bağlamı (sort context) bazen kabarcık (bubble), bazen hızlı (quick) sıralama kullansın.

Context ve setStrategy

Sorter bağlamı bir SortStrategy işaretçisi tutar. setStrategy metodu ile çalışma anında algoritma değiştirilir. Bağlam, algoritmanın nasıl çalıştığını bilmez; yalnızca sort() sanal metodunu çağırır.

Örnek: sorter.setStrategy(std::make_unique<AscendingSort>()); ile artan sıralama seçilir. sorter.run(v); çağrısı vektörü sıralar. Yeni bir algoritma eklemek için yalnızca yeni bir SortStrategy alt sınıfı yazarsın; Sorter değişmez. Bu, açık-kapalı prensibi (open-closed principle) sağlar.

Uygulama Sorter ve Strategy yaz

SortStrategy soyut sınıfını tanımla: virtual void sort(std::vector<int>& v) const = 0;. AscendingSort alt sınıfı std::sort(v.begin(), v.end()) yapsın. Sorter bağlamı bir unique_ptr<SortStrategy> tutsın ve run(v) metodu stratejiyi çağırsın. main içinde {3,1,2} vektörünü artan sırala ve elemanları yan yana yazdır.

Başlangıç kodu

main.cpp
#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>

// SortStrategy soyut sınıfını ve AscendingSort sınıfını tanımla
// Sorter bağlamını tanımla

int main() {
    // {3,1,2} vektörünü sırala ve yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>

class SortStrategy {
public:
    virtual ~SortStrategy() = default;
    virtual void sort(std::vector<int>& v) const = 0;
};

class AscendingSort : public SortStrategy {
public:
    void sort(std::vector<int>& v) const override {
        std::sort(v.begin(), v.end());
    }
};

class Sorter {
    std::unique_ptr<SortStrategy> strategy;
public:
    explicit Sorter(std::unique_ptr<SortStrategy> s) : strategy(std::move(s)) {}
    void run(std::vector<int>& v) const { strategy->sort(v); }
};

int main() {
    std::vector<int> v = {3, 1, 2};
    Sorter s(std::make_unique<AscendingSort>());
    s.run(v);
    for (int x : v) std::cout << x;
    return 0;
}

Beklenen çıktı

123

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Strategy deseni ne zaman kullanılır?

  • Aynı işin birden çok algoritması olduğunda Doğru cevap
  • Tek örnek gerektiğinde
  • Nesne oluşturmayı gizlemek istendiğinde
  • Olay bildirimi gerektiğinde

Açıklama: Strategy, aynı işin farklı algoritmaları olduğunda kullanılır.

2 Parçayı rolüne eşle

Kavram Anlamı
class SortStrategy Soyut algoritma
class AscendingSort Somut algoritma
class Sorter Bağlam (Context)
setStrategy(...) Algoritmayı değiştirir

3 setStrategy çağrısını tamamla

Soru
sorter.____(std::make_unique<AscendingSort>());
Cevap
sorter.setStrategy(std::make_unique<AscendingSort>());

Açıklama: setStrategy bağlamın algoritmasını değiştirir.

İleri seviye bölümündeki tüm dersler