Modell der Verantwortungskette (Chain of Responsibility Pattern) ist ein Verhaltensdesignmuster. Die Definition lautet wie folgt:
Vermeiden Sie die Kopplung von Sender und Empfänger einer Anfrage und geben Sie mehreren Objekten die Möglichkeit, die Anfrage zu bearbeiten.
Verbinden Sie die Objekte, die die Anfrage empfangen, zu einer Kette und leiten Sie die Anfrage entlang dieser Kette weiter, bis ein Objekt sie verarbeiten kann.
2. Die Rolle des Chain-of-Responsibility-Modells
Entkoppeln Sie Anfragen und Anfrageverarbeitung, um die Code-Skalierbarkeit zu verbessern.
3. Struktur des Chain-of-Responsibility-Modells
Das Chain-of-Responsibility-Modell umfasst hauptsächlich die folgenden Rollen:
Rolle des abstrakten Handlers: Definieren Sie eine Schnittstelle zum Verarbeiten von Anforderungen, einschließlich abstrakter Verarbeitungsmethoden und einer nachfolgenden Verbindung (jeder Handler in der Kette verfügt über eine Mitgliedsvariable, um einen Verweis auf den nächsten Handler zu speichern).
Rolle des Betonhandlers: Implementieren Sie die Verarbeitungsmethode des abstrakten Prozessors, um zu bestimmen, ob die Anfrage verarbeitet werden kann. Wenn die Anfrage verarbeitet werden kann, verarbeiten Sie sie, andernfalls wird die Anfrage an ihren Nachfolger übertragen.
Kundenrolle: Erstellen Sie eine Verarbeitungskette und senden Sie eine Anforderung an das spezifische Handlerobjekt an der Spitze der Kette. Dabei sind die Verarbeitungsdetails und der Anforderungszustellungsprozess unerheblich.
In der tatsächlichen Entwicklung kann das Verantwortungskettenmodell einen Verantwortungskettenmanager hinzufügen, der bestimmte Prozessoren verwaltet.
4. Anwendung des Chain-of-Responsibility-Modells in der tatsächlichen Entwicklung
In SpringBoot gibt es viele Möglichkeiten, das Chain-of-Responsibility-Muster zu praktizieren. Das Folgende ist ein Beispiel: mehrere unabhängige Prüflogiken für einen Bestellprozess.
4.1 Implementierungsmethode 1
Pojo erstellen, Objekt bestellen
publicclassOrderContext{privateString seqId;privateString userId;privateLong skuId;privateInteger amount;privateString userAddressId;// Getters and setters}