Java-Entwurfsmuster (design pattern): Strategy

Heute werfen wir einen Blick auf das nächste Entwurfsmuster (Java design patterns) aus der Kategorie der Verhaltensmuster (Behavioral Patterns) – Strategy. Entwurfsmuster in dieser Kategorie befassen sich mit der Kommunikation(interaction) zwischen Objekten und ihrer Verantwortung (responsibility).

Was ist das Entwurfsmuster Strategy?

Strategy ist ein Entwurfsmuster, das es ermöglicht, das Verhalten einer Klasse oder ihre Algorithmen dynamisch zur Laufzeit anzupassen. Wenn wir beispielsweise eine Klasse haben, die Daten validiert, muss ihre Struktur vor dem Programmstart nicht bekannt sein. Die Entscheidung, welcher Validierungsalgorithmus verwendet wird, erfolgt erst unmittelbar vor der Anwendung.

Was für ein Problem löst das Entwurfsmuster Strategy?

Das Entwurfsmuster Strategy löst das Problem, wenn wir flexibel den Weg ändern müssen, wie eine bestimmte Funktionalität zur Laufzeit implementiert wird. Es ermöglicht, eine Familie von Algorithmen oder Strategien zu definieren, jede in einer eigenen Klasse zu kapseln und sicherzustellen, dass die Objekte dieser Klassen austauschbar sind. Das Hauptziel des Entwurfsmuster Strategy ist es, die Möglichkeit zu bieten, das Verhalten eines Objekts dynamisch basierend auf der gewählten Strategie zu ändern. Zum Wechseln der Strategien wird ein Kontextobjekt verwendet, das eine Referenz auf das Strategieobjekt hält und dessen Methoden aufrufen kann.

Ein Beispiel für eine Strategie-Implementierung in Java.

Dieser Code demonstriert die Verwendung des Entwurfsmuster Strategy im Kontext eines Eishockeytrainers (Coach) und seiner Fähigkeit, das Spiel zwischen Offensiv- und Defensivstrategien auf der Grundlage des aktuellen Stands des Spiels zu wechseln. HernaStrategia.java

package designpatterns;

public interface HernaStrategia {
    void vykonat();
}

HernaStrategia ist ein Interface, das definiert, wie eine Strategie implementiert werden kann. Sie enthält eine einzige vykonat()-Methode, die definiert, wie die Strategie ausgeführt werden soll. 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.");
    }
}

UtocnaStrategia und ObrannaStrategia sind konkrete Implementierungen der Schnittstelle HernaStrategia. Jede dieser Klassen implementiert die Methode vykonat(), um eine spezifische Strategie auszuführen – entweder eine Angriffsstrategie oder eine Verteidigungsstrategie. 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 ist ein Kontext, der eine Strategie anwendet. Coach hat ein Attribut hernaStrategia, das die aktuelle Strategie speichert. Die Methode zmenitStrategiu() dient dazu, die aktuelle Strategie zu ändern, und die Methode vykonatStrategiu() führt sie aus. 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();
    }
}

In Main wird eine Instanz von Coach und zwei Instanzen von Strategien – eine offensive und eine defensive – erstellt. Es folgt eine Spielsimulation, bei der die Strategien je nach Spielverlauf gewechselt werden. Die Ausgabe dieses Beispiels ist:

Ausgabe des Programms für das Entwurfsmuster Strategie.
Ausgabe des Beispiels für das Entwurfsmuster Strategy.

Zusammenfassung

Das Entwurfsmuster Strategy wird häufig verwendet, wenn wir das Verhalten einer Klasse oder ihre Strategien dynamisch nach Bedarf zur Laufzeit ändern müssen. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausführen kannst. Lade den Java Strategy Code hier herunter. Wenn du einen Job suchst und Java-Programmierer bist, informiere dich über unsere Sozialleistungen und reagiere auf unsere aktuellen Stellenangebote.

Über den Autor

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.

Informieren Sie uns über sich