τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Το μοτίβο της αλυσίδας ευθύνης είναι ένα μοτίβο σχεδιασμού συμπεριφοράς που επιτρέπει σε πολλά αντικείμενα να χειρίζονται αιτήματα με τη σειρά και κάθε αντικείμενο μπορεί να επιλέξει αν θα χειριστεί το αίτημα ή θα το μεταβιβάσει στο επόμενο αντικείμενο. Αυτό το μοτίβο παρέχει μεγαλύτερη ευελιξία και επεκτασιμότητα αποσυνδέοντας τον αποστολέα και τον παραλήπτη των αιτημάτων. Ακολουθεί μια λεπτομερής εισαγωγή στο μοντέλο της αλυσίδας ευθύνης:
Ο πυρήνας του μοντέλου της αλυσίδας ευθύνης είναι ο σχεδιασμός μιας αλυσίδας αιτημάτων και η αναγνώριση του τέλους της αλυσίδας. Συνδέει πολλαπλά αντικείμενα χειρισμού αιτημάτων σε μια αλυσίδα και επιτρέπει στο αίτημα να περάσει στην αλυσίδα έως ότου ένα αντικείμενο στην αλυσίδα αποφασίσει να χειριστεί το αίτημα. Ο πελάτης που υποβάλλει το αίτημα δεν γνωρίζει ποιο αντικείμενο στην αλυσίδα θα χειριστεί τελικά το αίτημα, γεγονός που επιτρέπει στο σύστημα να αναδιοργανωθεί δυναμικά και να εκχωρήσει ευθύνες χωρίς να επηρεάσει τον πελάτη.
Διάγραμμα τάξης:
Το μοντέλο της αλυσίδας ευθύνης περιλαμβάνει κυρίως τους ακόλουθους ρόλους:
Αφηρημένος χειριστής (Handler) : Ορίστε μια διεπαφή για την επεξεργασία αιτημάτων. Εάν είναι απαραίτητο, η διεπαφή μπορεί να ορίσει μια μέθοδο για να ορίσει και να επιστρέψει μια αναφορά στην επόμενη διεπαφή. Αυτός ο ρόλος συνήθως υλοποιείται από μια αφηρημένη κλάση ή διεπαφή.
Χειριστής σκυροδέματος : Αφού λάβει το αίτημα, ο συγκεκριμένος επεξεργαστής μπορεί να επιλέξει να επεξεργαστεί το αίτημα ή να διαβιβάσει το αίτημα στο επόμενο μέρος. Δεδομένου ότι ο επεξεργαστής σκυροδέματος έχει μια αναφορά στο επόμενο σπίτι, ο επεξεργαστής σκυροδέματος μπορεί να έχει πρόσβαση στο επόμενο σπίτι εάν χρειαστεί.
Κατηγορία πελάτη (Πελάτης): Δημιουργήστε μια αλυσίδα επεξεργασίας και υποβάλετε ένα αίτημα στο συγκεκριμένο αντικείμενο επεξεργαστή της κεφαλής της αλυσίδας.
Το μοντέλο της αλυσίδας ευθύνης είναι κατάλληλο για τα ακόλουθα σενάρια:
Πολλά αντικείμενα επεξεργάζονται από κοινού μια εργασία: Για παράδειγμα, ένα σύστημα έγκρισης πολλαπλών επιπέδων μεταβιβάζει το αίτημα έγκρισης στο επόμενο επίπεδο έγκρισης βάσει της εξουσίας και του επιπέδου του εγκρίοντος μέχρι να ληφθεί το τελικό αποτέλεσμα έγκρισης.
Δυναμική συνδυαστική ροή επεξεργασίας: Με την ευέλικτη διαμόρφωση της αλυσίδας ευθύνης, τα αντικείμενα επεξεργασίας μπορούν να συνδυαστούν δυναμικά για την υλοποίηση διαφορετικών διαδικασιών επεξεργασίας.
Αποφύγετε την άμεση σύζευξη μεταξύ του αποστολέα και του παραλήπτη ενός αιτήματος: Περνώντας το αίτημα στην αλυσίδα ευθύνης, ο αποστολέας του αιτήματος δεν χρειάζεται να γνωρίζει το συγκεκριμένο αντικείμενο επεξεργασίας, μειώνοντας την εξάρτηση μεταξύ των αντικειμένων.
Το μοντέλο της αλυσίδας ευθύνης χρησιμοποιείται ευρέως σε πολλούς τομείς, συμπεριλαμβανομένων ενδεικτικά:
Το παρακάτω είναι ένα απλό παράδειγμα υλοποίησης του μοτίβου της αλυσίδας ευθύνης, το οποίο χρησιμοποιείται για την επεξεργασία μηνυμάτων καταγραφής και τη διαβίβαση των μηνυμάτων σε διαφορετικούς επεξεργαστές ανάλογα με το επίπεδο καταγραφής (όπως DEBUG, INFO, WARN, ERROR):
- // 抽象处理者
- abstract class LogHandler {
- protected int level;
- protected LogHandler nextHandler;
-
- public void setNextHandler(LogHandler nextHandler) {
- this.nextHandler = nextHandler;
- }
-
- //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
- public void logMessage(int level, String message) {
- if (this.level <= level) {
- write(message);
- }
- if (nextHandler != null) {
- nextHandler.logMessage(level, message);
- }
- }
-
- abstract protected void write(String message);
- }
-
- // 具体处理者:ErrorLogHandler
- class ErrorLogHandler extends LogHandler {
- public ErrorLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("ErrorLogHandler: " + message);
- }
- }
-
- // 具体处理者:WarnLogHandler
- class WarnLogHandler extends LogHandler {
- public WarnLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("WarnLogHandler: " + message);
- }
- }
-
- // 具体处理者:InfoLogHandler
- class InfoLogHandler extends LogHandler {
- public InfoLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("InfoLogHandler: " + message);
- }
- }
-
- // 客户端代码
- public class ChainPatternDemo {
- private static LogHandler getChainOfLoggers() {
- // 创建链中的处理者
- LogHandler errorLogHandler = new ErrorLogHandler(3);
-
- LogHandler warnLogHandler = new WarnLogHandler(2);
- warnLogHandler.setNextHandler(errorLogHandler);
-
- LogHandler infoLogHandler = new InfoLogHandler(1);
- infoLogHandler.setNextHandler(warnLogHandler);
-
- return infoLogHandler;
- }
-
- public static void main(String[] args) {
- LogHandler loggerChain = getChainOfLoggers();
-
- loggerChain.logMessage(1, "This is an informational message.");
- loggerChain.logMessage(2, "This is a warning message.");
- loggerChain.logMessage(3, "This is an error message.");
- }
- }
Σε αυτό το παράδειγμα, ορίζουμε τρεις συγκεκριμένες κατηγορίες χειριστή κορμών (ErrorLogHandler
、WarnLogHandler
、InfoLogHandler
), χειρίζονται διαφορετικά επίπεδα μηνυμάτων καταγραφής αντίστοιχα. Κάθε χειριστής περιέχει ένα επίπεδο (level
), χρησιμοποιείται για να προσδιορίσει εάν τα μηνύματα αυτού του επιπέδου θα πρέπει να υποβάλλονται σε επεξεργασία.Με την κλήσηlogMessage
μέθοδο, το αίτημα μεταβιβάζεται στον πρώτο χειριστή στην αλυσίδα (infoLogHandler
), αποφασίζει εάν θα επεξεργαστεί το μήνυμα με βάση το δικό του επίπεδο και λογική επεξεργασίας και στη συνέχεια (αν δεν υποβληθεί σε επεξεργασία) μεταβιβάζει το αίτημα στον επόμενο επεξεργαστή της αλυσίδας. Αυτή η διαδικασία συνεχίζεται μέχρι το τέλος της αλυσίδας ή μέχρι να διεκπεραιωθεί το αίτημα.
Σημειώστε ότι σε μια πραγματική εφαρμογή, ίσως χρειαστείLogHandler
Η κλάση προσθέτει περισσότερες μεθόδους και ιδιότητες για να υποστηρίξει πιο περίπλοκη λογική επεξεργασίας αρχείων καταγραφής και διαμόρφωση. Επιπλέον, τα επίπεδα καταγραφής συνήθως χρησιμοποιούν απαριθμήσεις (enum
) αντί για ακέραιους για τη βελτίωση της αναγνωσιμότητας και της συντηρησιμότητας του κώδικα.
Το μοτίβο της αλυσίδας ευθύνης επιτυγχάνει ευέλικτη επεξεργασία αιτημάτων και επεκτασιμότητα του συστήματος συνδέοντας πολλαπλά αντικείμενα που χειρίζονται αιτήματα σε μια αλυσίδα και επιτρέποντας στο αίτημα να περάσει στην αλυσίδα έως ότου ένα αντικείμενο στην αλυσίδα αποφασίσει να χειριστεί το αίτημα.
Εάν το μοντέλο της αλυσίδας ευθύνης σας είναι χρήσιμο, θυμηθείτε να κάνετε like και να το συλλέξετε.