behavioral pattern (tsz. behavioral patterns)
A behavioral design patterns (viselkedési tervezési minták) célja, hogy az objektumok közötti kommunikációt, együttműködést és felelősségelosztást szabályozzák. Ezek a minták nem az objektumok szerkezetét változtatják meg, hanem azt, hogyan viselkednek, hogyan válaszolnak eseményekre, hogyan hívják egymás metódusait, és hogyan kezdenek adatokat egymás között.
Minta | Célja |
---|---|
Observer | Eseményfigyelők automatikus értesítése |
Strategy | Algoritmus dinamikus cseréje |
Command | Művelet objektummá alakítása, futás elhalasztása |
State | Objektum viselkedése az állapotától függ |
Template Method | Algoritmus váza az alosztályokra bízott lépésekkel |
Chain of Responsibility | Egymás után kipróbált handler objektumok |
Mediator | Kommunikáció központosítása |
Memento | Objektum állapotának mentése és visszaállítása |
Interpreter | Nyelvtan értelmezése, kifejezések kiértékelése |
Iterator | Kollekció bejárása absztrakt módon |
Visitor | Művelet hozzáadása osztály módosítása nélkül |
Cél: Több objektum (megfigyelő) automatikusan értesüljön egy másik objektum állapotváltozásáról.
class Observer {
public:
virtual void update(int value) = 0;
};
class Subject {
std::vector<Observer*> observers;
int state = 0;
public:
void attach(Observer* obs) { observers.push_back(obs); }
void setState(int s) {
state = s;
for (auto o : observers) o->update(state);
}
};
Cél: Algoritmusok cserélhetők futásidőben egy interfészen keresztül.
class Strategy {
public:
virtual void execute() = 0;
};
class ConcreteStrategyA : public Strategy {
public:
void execute() override { std::cout << "A stratégia\n"; }
};
class Context {
Strategy* strategy;
public:
Context(Strategy* s) : strategy(s) {}
void run() { strategy->execute(); }
};
Cél: Művelet reprezentálása objektumként. Támogatja a tárolást, visszavonást, sorba állítást.
class Command {
public:
virtual void execute() = 0;
};
class Light {
public:
void on() { std::cout << "Lámpa bekapcsolva\n"; }
};
class LightOnCommand : public Command {
Light* light;
public:
LightOnCommand(Light* l) : light(l) {}
void execute() override { light->on(); }
};
Cél: Objektum viselkedésének megváltoztatása az aktuális állapottól függően.
class State {
public:
virtual void handle() = 0;
};
class Context {
State* state;
public:
void setState(State* s) { state = s; }
void request() { state->handle(); }
};
Cél: Algoritmus váza az ősosztályban, egyes lépések az alosztályban valósulnak meg.
class Game {
public:
void play() {
start();
playTurn();
end();
}
virtual void start() = 0;
virtual void playTurn() = 0;
virtual void end() = 0;
};
Helyzet | Minta |
---|---|
Több objektum reagál egy eseményre | Observer |
Különböző viselkedések futásidőben válthatók | Strategy |
El akarod menteni és visszaállítani egy objektum állapotát | Memento |
El akarod kerülni, hogy objektumok közvetlenül kommunikáljanak | Mediator |
Parancsokat szeretnél tárolni és végrehajtani később | Command |