Strategy
- C++ kursu
- İleri seviye
- Ders 33/83
- 5 dk
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
#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
#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
sorter.____(std::make_unique<AscendingSort>());
sorter.setStrategy(std::make_unique<AscendingSort>());
Açıklama: setStrategy bağlamın algoritmasını değiştirir.