Chain of Responsibility - Koll3g/DesignPatterns GitHub Wiki
Absicht
Das Chain of Responsibility Design Pattern erlaubt es Anfragen entlang einer Kette von Objekten zu leiten. Jedes Objekt entscheidet ob es die Anfrage bearbeitet oder zum nächsten Objekt in der Kette weiterschickt.
Problem
Angenommen man arbeitet an einem Online Shop. Der Zugriff auf das System soll so beschränkt werden, dass nur autentifizierte Benutzer Bestellungen aufgeben können. Des weiteren sollen Benutzer mit administrativen Rechten vollen Zugriff auf die Bestellungen besitzen. Solche Überprüfungen werden der Reihe nach vorgenommen. Sollte aber schon bei der ersten Überprüfung auffallen, dass der Benutzer keine Rechte besitzt um Bestellungen aufzugeben, so kann die Überprüfung auf administrative Rechte übersprungen werden.
Werden immer weitere Verbesserungen hinzugefügt wie z.B. weitere Überprüfngen oder optimierte Prozesse so kann ganz schnell eine Unordnung entstehen. Neue Änderungen können den bestehenden Code beeinflussen. Das System wird somit unübersichtlich und teurer zu unterhalten.
Lösung
Das Chain of Responsibility Design Pattern basiert darauft, bestimmte Verhaltensweisen abzukoppeln und in einzelne Objekte zu verwandeln. Diese werden Handlers genannt. Im Beispiel des Online Shops solten alle Überprüfngen in einzelne Klassen mit jeweils einer Methode unterteilt werden, welche dann die Überprüfungen vornehmen. Die Anfrage mit den dazugehörigen Daten werden als Argumente der Methode übergeben. Das Design Pattern empfiehlt diese Handlers in eine Kette zu verknüpfen. Jeder Handler besitzt eine Referenz zum nächsten Handler in der Kette. Die Anfrage bewegt sich der Kette entlang bis es entweder alle Handler durchlaufen konnte oder die Kette entscheidet, dass die restlichen Überprüfngen nicht mehr nötig sind.
UML Diagramm
Vor- und Nachteile
Vorteile
- Man kann die Reihenfolge der Überprüfungen/Handler bestimmen
- Man kann das "Single Responsibility Principle" einhalten.
- Neue Handler können hinzugefügt werden, ohne dass der bestehende Code beeinflusst
Nachteile
- Manche Anfragen könnten nicht bearbeitet werden. Wenn das letzte Glied der Kette eine Anfrage erhält, für die es ebenfalls nicht zuständig ist, wird die Anfrage verworfen. Dies muss durch eine entsprechende Fallbehandlung abgefangen werden.