Java-Entwurfsmuster (design patterns): Chain of Reponsibility

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

Was ist das Entwurfsmuster Chain of Responsibility?

Das Entwurfsmuster Chain of Responsibility (Verantwortungskette) ist ein Muster, das es mehreren Objekten ermöglicht, Anfragen zu bearbeiten, ohne dass das Objekt wissen muss, wer sein Nachfolger in der Kette ist. Jedes Objekt in der Kette ist in der Lage, die Anfrage zu bearbeiten, aber wenn es nicht weiß, wie es sie bearbeiten soll, gibt es sie an das nächste Objekt in der Kette weiter.

Welches Problem löst das Chain of Responsibility Design Pattern?

Es löst das Problem der Bearbeitung von Anfragen in einer Kette, so dass die Anfrage nicht an ein bestimmtes Objekt gesendet wird, sondern eine Kette von Objekten durchläuft, wobei jedes Objekt in der Kette für die Bearbeitung der Anfrage verantwortlich sein kann, aber wenn es die Anfrage nicht bearbeitet, leitet es sie an das nächste Objekt in der Kette weiter. Ziel ist es, mehreren Objekten die Bearbeitung einer Anfrage zu ermöglichen, ohne dass genau festgelegt werden muss, welches Objekt die Anfrage bearbeiten soll. Dadurch wird die Abhängigkeit zwischen dem Sender und dem Empfänger der Anfrage verringert.

Beispiel für die Implementierung des Chain of Responsibility-Musters in Java.

Jetzt werden wir ein Programm schreiben, das die Genehmigung von Mitarbeiteranträgen in einem Unternehmen simuliert und dabei das Entwurfsmuster Chain of Responsibility verwendet. Das Ziel dieses Musters ist es, mehreren Objekten zu ermöglichen, eine Anforderung zu verarbeiten, ohne dass wir genau wissen, welches Objekt sie verarbeiten wird. Die Objekte sind in einer Kette angeordnet, und jedes Objekt in der Kette entscheidet, ob es die jeweilige Anforderung verarbeiten kann oder ob es sie an das nächste Objekt in der Kette weiterleitet. In diesem Programm gibt es drei Arten von Mitarbeitern – Zamestnanec, Veduci und Riaditel, von denen jeder eine abstrakte Klasse, SchvalovatelPoziadavky, implementiert, die gemeinsame Funktionen für alle Mitarbeiter enthält. SchvalovatelPoziadavky.java

package designpatterns;

public abstract class SchvalovatelPoziadavky {
    String meno;
    SchvalovatelPoziadavky dalsiSchvalovatel;
    private SchvalovatelPoziadavky(){

    }
    public SchvalovatelPoziadavky(String meno){
        this.meno = meno;
    }
    public abstract void nastavitDalsiehoSchvalovatela(SchvalovatelPoziadavky dalsiSchvalovatel);

    public void posuditPoziadavku(String poziadavka)
    {
        if(this.dalsiSchvalovatel != null)
            this.dalsiSchvalovatel.posuditPoziadavku(poziadavka);
        else
            System.out.println(poziadavka + " - poziadavka bola zamietnuta!");
    }
}

Die abstrakte Klasse SchvalovatelPoziadavky definiert gemeinsame Methoden und enthält einen Verweis auf den nächsten Genehmiger in der Kette. Zamestnanec.java

package designpatterns;

public class Zamestnanec extends SchvalovatelPoziadavky {
    public Zamestnanec() {
        super("zamestnanec");
    }
    @Override
    public void nastavitDalsiehoSchvalovatela(SchvalovatelPoziadavky dalsiSchvalovatel) {
        this.dalsiSchvalovatel = dalsiSchvalovatel;
    }
    @Override
    public void posuditPoziadavku(String poziadavka) {
        if(poziadavka == "NAVSTEVA_LEKARA") {
            System.out.println(poziadavka + " - " + meno + " schvalil poziadavku");
        }
        else {
            super.posuditPoziadavku(poziadavka);
        }
    }
}

Veduci.java

package designpatterns;

public class Veduci extends SchvalovatelPoziadavky {
    public Veduci() {
        super("veduci");
    }
    @Override
    public void nastavitDalsiehoSchvalovatela(SchvalovatelPoziadavky dalsiSchvalovatel) {
        this.dalsiSchvalovatel = dalsiSchvalovatel;
    }
    @Override
    public void posuditPoziadavku(String poziadavka) {
        if(poziadavka == "DOVOLENKA") {
            System.out.println(poziadavka + " - " + meno + " schvalil poziadavku");
        }
        else {
            super.posuditPoziadavku(poziadavka);
        }
    }
}

Riaditel.java

package designpatterns;
public class Riaditel extends SchvalovatelPoziadavky {
    public Riaditel() {
        super("riaditel");
    }
    @Override
    public void nastavitDalsiehoSchvalovatela(SchvalovatelPoziadavky dalsiSchvalovatel) {
        this.dalsiSchvalovatel = dalsiSchvalovatel;
    }
    @Override
    public void posuditPoziadavku(String poziadavka) {
        if(poziadavka == "ZVYSENIE_PLATU") {
            System.out.println(poziadavka + " - " + meno + " schvalil poziadavku");
        }
        else {
            super.posuditPoziadavku(poziadavka);
        }
    }
}

Zamestnanec, Veduci, Riaditel sind konkrete Klassen, die die einzelnen Mitarbeiter repräsentieren. Jeder von ihnen kann bestimmte Arten von Anfragen genehmigen, aber wenn sie für einige davon nicht autorisiert sind, geben sie diese an den nächsten Genehmiger in der Kette weiter. Main.java

import designpatterns.Riaditel;
import designpatterns.SchvalovatelPoziadavky;
import designpatterns.Veduci;
import designpatterns.Zamestnanec;

public class Main {
    public static void main(String[] args) {
        // Clanky retaze
        SchvalovatelPoziadavky zamestnanec = new Zamestnanec();
        SchvalovatelPoziadavky veduci = new Veduci();
        SchvalovatelPoziadavky riaditel = new Riaditel();
        // Vytvorenie retaze zodpovednosti
        zamestnanec.nastavitDalsiehoSchvalovatela(veduci);
        veduci.nastavitDalsiehoSchvalovatela(riaditel);
        // Posudenie poziadaviek
        zamestnanec.posuditPoziadavku("NAVSTEVA_LEKARA");
        zamestnanec.posuditPoziadavku("DOVOLENKA");
        zamestnanec.posuditPoziadavku("ZVYSENIE_PLATU");
        zamestnanec.posuditPoziadavku("FIREMNE_AUTO");
    }
}

In der Hauptmethode erstellen wir eine Kette von Zuständigkeiten, legen eine Hierarchie einzelner Mitarbeiter an und überprüfen dann die verschiedenen Anträge. Jeder Mitarbeiter versucht, die Anfrage zu genehmigen. Wenn er sie nicht genehmigen kann, delegiert er sie an den nächsten Genehmiger in der Kette.

In der Methode main erstellen wir die Verantwortungskette, bauen die Hierarchie der einzelnen Mitarbeiter auf und bewerten dann verschiedene Anfragen.
Die Ausgabe dieses Beispiels.

Zusammenfassung

Das EntwurfsmusterChain of Responsibility wird bei der Softwareentwicklung verwendet, wenn wir eine flexible Art der Bearbeitung von Anfragen erreichen wollen, ohne eine starre Verbindung zwischen dem Absender und dem Bearbeiter der Anfrage herzustellen und sie zur Bearbeitung an eine Kette von Objekten weiterzuleiten. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausführen kannst. Lade den Java Code Chain of Responsibility hier herunter. Wenn du als Java Entwickler auf der Suche nach einem Job bist, informiere dich über unsere Mitarbeiterbenefits und reagieren Sie 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