Ugrás a tartalomhoz

strategy pattern

A Wikiszótárból, a nyitott szótárból


Főnév

strategy pattern (tsz. strategy patterns)

  1. (informatika) A Strategy pattern (stratégia minta) egy viselkedési tervezési minta, amely lehetővé teszi, hogy egy algoritmuscsaládot definiáljunk, az algoritmusokat egymással felcserélhető objektumokba csomagoljuk, és azok használatát a kliensosztályból delegáljuk. A minta célja a rugalmasság és a nyitott/zárt elv (OCP) betartása.



🧠 Miért hasznos?

A Strategy minta akkor hasznos, ha:

  • Többféle algoritmus (stratégia) létezik egy művelethez.
  • Ezek között futásidőben szeretnél váltani.
  • Nem akarsz if-else vagy switch-case szerkezeteket használni az algoritmus kiválasztására.
  • A viselkedést a kontextustól (azaz a stratégiát használó objektumtól) függetleníteni akarod.



🎯 Cél

  1. Az algoritmusok legyenek felcserélhetők.
  2. A kliens ne ismerje az algoritmus részleteit.
  3. Karbantarthatóbb, bővíthetőbb kód.



🧱 Alapstruktúra

// Stratégia interfész
class Strategy {
public:
    virtual void execute() const = 0;
    virtual ~Strategy() {}
};

// Konkrét stratégia 1
class ConcreteStrategyA : public Strategy {
public:
    void execute() const override {
        std::cout << "Stratégia A végrehajtása\n";
    }
};

// Konkrét stratégia 2
class ConcreteStrategyB : public Strategy {
public:
    void execute() const override {
        std::cout << "Stratégia B végrehajtása\n";
    }
};

// Kontextus
class Context {
private:
    Strategy* strategy;
public:
    Context(Strategy* s) : strategy(s) {}

    void setStrategy(Strategy* s) {
        strategy = s;
    }

    void run() const {
        strategy->execute();
    }
};

🔧 Használat

int main() {
    ConcreteStrategyA stratA;
    ConcreteStrategyB stratB;

    Context context(&stratA);
    context.run();  // Stratégia A

    context.setStrategy(&stratB);
    context.run();  // Stratégia B

    return 0;
}

✅ Előnyök

  • Az algoritmusok függetlenek a használó osztálytól.
  • Könnyen bővíthető: új algoritmus csak új osztály.
  • Csökkenti az if-eket, switch-eket → tiszta kód.
  • Egységtesztelhető: a stratégiák külön-külön.



❌ Hátrányok

  • Sok külön osztályt igényel (egy stratégia = egy osztály).
  • Növeli az absztrakciós szintet → komplexebb a kód.
  • A kliensnek tudnia kell választani stratégiát (vagy egy Factory-ra bízni).



🧪 Használati példák

  • Rendezés különböző algoritmusokkal
  • Fizetési módok egy webáruházban: PayPal, bankkártya, kripto
  • Játékbeli viselkedések: különböző AI taktikák
  • Különböző tömörítési módszerek: ZIP, RAR, LZMA



🆚 Strategy vs State minta

Jellemző Strategy pattern State pattern
Cél Algoritmusok cserélhetősége Állapot szerinti viselkedés változtatása
Klienstől függ Kliensem választja Objektum önállóan vált stratégiát
Objektum szerepe Algoritmust kiválaszt Belső állapot szerint működik



🧩 Kombinálható minták

  • Factory + Strategy – futásidőben példányosítjuk a megfelelő stratégiát
  • Decorator + Strategy – stratégia viselkedését dinamikusan bővíthetjük
  • Observer + Strategy – eseményre reagáló stratégia váltás



📌 TL;DR

  • A Strategy pattern segít algoritmusokat leválasztani a kliensekről.
  • Javítja a bővíthetőséget és tesztelhetőséget.
  • Tipikus alkalmazási terület: fizetési módok, játék AI, adatfeldolgozási módok.