Návrhové vzory Java (design patterns): Strategy

Dnes sa pozrieme na posledný návrhový vzor Strategy (java design patterns) z kategórie vzorov správania (behavioral patterns). Návrhové vzory v tejto kategórii sa zaoberajú komunikáciou (interaction) medzi objektami a ich zodpovednosťou (responsibility).

Čo je návrhový vzor Strategy?

Strategy je návrhový vzor, ktorý umožňuje meniť správanie triedy, resp. jej algoritmy dynamicky podľa potreby za behu programu. Ak napr. máme triedu, ktorá vykonáva validáciu dát, ich štruktúra nemusí byť pred spustením známa a o tom, ktorý validačný algoritmus sa použije sa rozhodne až bezprostredne pred ich použitím.

Aký problém návrhový vzor Strategy rieši?

Vzor Strategy (Stratégia) rieši problém, keď potrebujeme flexibilne meniť spôsob implementácie určitej funkcionality za behu programu. Umožňuje definovať rodinu algoritmov alebo stratégií, umiestniť každú z nich do samostatnej triedy a zabezpečiť, aby boli ich objekty vzájomne zameniteľné.

Hlavným cieľom je poskytnúť možnosť dynamicky meniť správanie objektu podľa zvolenej stratégie. Na prepínanie stratégií sa používa kontextový objekt, ktorý má referenciu na objekt stratégie a môže volať aj jej metódy.

Príklad Strategy implementácie v Jave

Tento kód demonštruje použitie návrhového vzoru Strategy v kontexte hokejového trénera (Coach) a jeho schopnosti meniť hru medzi útočnou a obrannou stratégiou na základe aktuálneho stavu zápasu.

HernaStrategia.java

package designpatterns;

public interface HernaStrategia {
    void vykonat();
}

HernaStrategia je rozhranie, ktoré definuje spôsob, ako môže byť stratégia implementovaná. Obsahuje jedinú metódu vykonat(), ktorá definuje spôsob vykonania stratégie.

UtocnaStrategia.java, ObrannaStrategia.java

package designpatterns;

public class UtocnaStrategia implements HernaStrategia {
    @Override
    public void vykonat() {
        System.out.println("Tím hrá v útočnej formácii.");
    }
}

public class ObrannaStrategia implements HernaStrategia {
    @Override
    public void vykonat() {
        System.out.println("Tím prechádza do obrannej formácie.");
    }
}

UtocnaStrategiaObrannaStrategia sú konkrétne implementácie rozhrania HernaStrategia. Každá z týchto tried implementuje metódu vykonat() tak, aby vykonala konkrétnu stratégiu – útočnú resp. obrannú.

Coach.java

package designpatterns;

// Kontext
public class Coach {
    private HernaStrategia hernaStrategia;

    public void zmenitStrategiu(HernaStrategia novaStrategia) {
        this.hernaStrategia = novaStrategia;
    }

    public void vykonatStrategiu() {
        hernaStrategia.vykonat();
    }
}

Coach je kontext, ktorý používa stratégiu. Má atribút hernaStrategia, ktorý drží aktuálnu stratégiu. Metóda zmenitStrategiu() slúži na zmenu aktuálnej stratégie a metóda vykonatStrategiu() ju vykonáva.

Main.java

import designpatterns.Coach;
import designpatterns.HernaStrategia;
import designpatterns.ObrannaStrategia;
import designpatterns.UtocnaStrategia;

public class Main {
    public static void main(String[] args) {
        Coach coach = new Coach();
        HernaStrategia utocnaStrategia = new UtocnaStrategia();
        HernaStrategia obrannaStrategia = new ObrannaStrategia();

        System.out.println("Začala sa hra.");

        // Coach vyberá stratégiu podľa priebehu hry
        // Začíname s útočnou stratégiou
        coach.zmenitStrategiu(utocnaStrategia);
        coach.vykonatStrategiu();

        System.out.println("Tím striela gól a vedie.");

        // Ak tím vyhráva, zmeníme na obrannú stratégiu
        // (simulujeme, že sa tím dostáva do obrannej fázy, keď vedie v zápase)
        coach.zmenitStrategiu(obrannaStrategia);
        coach.vykonatStrategiu();

        System.out.println("Súper striela gól a vyrovnáva.");

        // Ak tím prehráva, môžeme sa opäť vrátiť k útočnej stratégii
        // (simulujeme, že tím znova prechádza do útočnej fázy, keď prehráva)
        coach.zmenitStrategiu(utocnaStrategia);
        coach.vykonatStrategiu();
    }
}

V triede Main sa vytvára inštancia Coach a dve inštancie stratégií – útočnej a obrannej. Nasleduje simulácia hry, kde sa menia stratégie podľa priebehu zápasu.

Výstup z tohto príkladu je:

Výstup z programu pre Java návrhový vzor Strategy.
Výstup z príkladu pre návrhový vzor Strategy.

Zhrnutie

Vzor Strategy sa často používa, keď potrebujeme meniť správanie triedy, resp. jej stratégie dynamicky podľa potreby za behu programu.

Pripravili sme pre teba súbory so spomínaným príkladom vo forme kódu, ktorý si môžeš spustiť priamo v Jave. Stiahni si kód Java Strategy tu.

Ak hľadáš prácu a si Java programátor, prezri si naše benefity pre zamestnancov a reaguj na najnovšie ponuky práce.

O autorovi

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Daj nám o sebe vedieť