Κοινή χρήση τεχνολογίας

Μοτίβο σχεδίασης αλυσίδας ευθύνης

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Το μοτίβο της αλυσίδας ευθύνης είναι ένα μοτίβο σχεδιασμού συμπεριφοράς που επιτρέπει σε πολλά αντικείμενα να χειρίζονται αιτήματα με τη σειρά και κάθε αντικείμενο μπορεί να επιλέξει αν θα χειριστεί το αίτημα ή θα το μεταβιβάσει στο επόμενο αντικείμενο. Αυτό το μοτίβο παρέχει μεγαλύτερη ευελιξία και επεκτασιμότητα αποσυνδέοντας τον αποστολέα και τον παραλήπτη των αιτημάτων. Ακολουθεί μια λεπτομερής εισαγωγή στο μοντέλο της αλυσίδας ευθύνης:

1. Ορισμός και βασικές ιδέες

Ο πυρήνας του μοντέλου της αλυσίδας ευθύνης είναι ο σχεδιασμός μιας αλυσίδας αιτημάτων και η αναγνώριση του τέλους της αλυσίδας. Συνδέει πολλαπλά αντικείμενα χειρισμού αιτημάτων σε μια αλυσίδα και επιτρέπει στο αίτημα να περάσει στην αλυσίδα έως ότου ένα αντικείμενο στην αλυσίδα αποφασίσει να χειριστεί το αίτημα. Ο πελάτης που υποβάλλει το αίτημα δεν γνωρίζει ποιο αντικείμενο στην αλυσίδα θα χειριστεί τελικά το αίτημα, γεγονός που επιτρέπει στο σύστημα να αναδιοργανωθεί δυναμικά και να εκχωρήσει ευθύνες χωρίς να επηρεάσει τον πελάτη.

2. Διάγραμμα τάξης και κύριοι ρόλοι

Διάγραμμα τάξης:

Το μοντέλο της αλυσίδας ευθύνης περιλαμβάνει κυρίως τους ακόλουθους ρόλους:

  1. Αφηρημένος χειριστής (Handler) : Ορίστε μια διεπαφή για την επεξεργασία αιτημάτων. Εάν είναι απαραίτητο, η διεπαφή μπορεί να ορίσει μια μέθοδο για να ορίσει και να επιστρέψει μια αναφορά στην επόμενη διεπαφή. Αυτός ο ρόλος συνήθως υλοποιείται από μια αφηρημένη κλάση ή διεπαφή.

  2. Χειριστής σκυροδέματος : Αφού λάβει το αίτημα, ο συγκεκριμένος επεξεργαστής μπορεί να επιλέξει να επεξεργαστεί το αίτημα ή να διαβιβάσει το αίτημα στο επόμενο μέρος. Δεδομένου ότι ο επεξεργαστής σκυροδέματος έχει μια αναφορά στο επόμενο σπίτι, ο επεξεργαστής σκυροδέματος μπορεί να έχει πρόσβαση στο επόμενο σπίτι εάν χρειαστεί.

  3. Κατηγορία πελάτη (Πελάτης): Δημιουργήστε μια αλυσίδα επεξεργασίας και υποβάλετε ένα αίτημα στο συγκεκριμένο αντικείμενο επεξεργαστή της κεφαλής της αλυσίδας.

3. Ισχύοντα σενάρια

Το μοντέλο της αλυσίδας ευθύνης είναι κατάλληλο για τα ακόλουθα σενάρια:

  1. Πολλά αντικείμενα επεξεργάζονται από κοινού μια εργασία: Για παράδειγμα, ένα σύστημα έγκρισης πολλαπλών επιπέδων μεταβιβάζει το αίτημα έγκρισης στο επόμενο επίπεδο έγκρισης βάσει της εξουσίας και του επιπέδου του εγκρίοντος μέχρι να ληφθεί το τελικό αποτέλεσμα έγκρισης.

  2. Δυναμική συνδυαστική ροή επεξεργασίας: Με την ευέλικτη διαμόρφωση της αλυσίδας ευθύνης, τα αντικείμενα επεξεργασίας μπορούν να συνδυαστούν δυναμικά για την υλοποίηση διαφορετικών διαδικασιών επεξεργασίας.

  3. Αποφύγετε την άμεση σύζευξη μεταξύ του αποστολέα και του παραλήπτη ενός αιτήματος: Περνώντας το αίτημα στην αλυσίδα ευθύνης, ο αποστολέας του αιτήματος δεν χρειάζεται να γνωρίζει το συγκεκριμένο αντικείμενο επεξεργασίας, μειώνοντας την εξάρτηση μεταξύ των αντικειμένων.

4. Πλεονεκτήματα και μειονεκτήματα

πλεονέκτημα
  1. Μειώστε τη σύζευξη: Αποσυνδέει τον αποστολέα και τον παραλήπτη του αιτήματος Το αίτημα αποστέλλεται μόνο, ανεξάρτητα από το ποιος το χειρίζεται.
  2. Βελτιωμένη ευελιξία στην ανάθεση αντικειμένων: Επιτρέπει τη δυναμική προσθήκη ή διαγραφή ευθυνών αλλάζοντας μέλη εντός της αλυσίδας ή μετακινώντας την παραγγελία τους.
  3. Απλοποίηση αντικειμένων: Το αντικείμενο δεν χρειάζεται να γνωρίζει τη δομή της αλυσίδας.
  4. Είναι βολικό να προσθέσετε νέες κατηγορίες επεξεργασίας αιτημάτων: Ακολουθώντας την αρχή ανοίγματος και κλεισίματος, νέοι επεξεργαστές μπορούν να προστεθούν στην αλυσίδα ευθύνης ανά πάσα στιγμή χωρίς τροποποίηση του υπάρχοντος κώδικα, παρέχοντας καλή επεκτασιμότητα.
έλλειψη
  1. Δεν υπάρχει καμία εγγύηση ότι το αίτημα θα γίνει δεκτό: Εάν η αλυσίδα ευθύνης δεν έχει ρυθμιστεί σωστά ή ο επεξεργαστής δεν χειριστεί σωστά το αίτημα, το αίτημα ενδέχεται να μην υποβληθεί σε επεξεργασία.
  2. Ζητήματα επιδόσεων: Όταν η αλυσίδα ευθύνης είναι πολύ μεγάλη ή τα αιτήματα περνούν συχνά στην αλυσίδα ευθύνης, η απόδοση μπορεί να επηρεαστεί.
  3. Ο εντοπισμός σφαλμάτων είναι άβολος: Όταν η αλυσίδα ευθύνης είναι ιδιαίτερα μεγάλη και έχει πολλούς κρίκους, η λογική μπορεί να είναι πιο περίπλοκη κατά τον εντοπισμό σφαλμάτων λόγω μιας αναδρομικής προσέγγισης.

5. Σενάρια εφαρμογής

Το μοντέλο της αλυσίδας ευθύνης χρησιμοποιείται ευρέως σε πολλούς τομείς, συμπεριλαμβανομένων ενδεικτικά:

  1. Σύστημα καταγραφής: Διαβιβάστε μηνύματα καταγραφής σε διαφορετικά καταγραφικά ανάλογα με το επίπεδο καταγραφής, όπως καταγραφικό κονσόλας, καταγραφή αρχείων, καταγραφικό βάσης δεδομένων κ.λπ.
  2. Σύστημα χειρισμού εξαιρέσεων: Ταξινόμηση εξαιρέσεων ανάλογα με τον τύπο τους, όπως καταγραφή, ειδοποιήσεις μέσω email, εμφάνιση εξαιρέσεων κ.λπ.
  3. Σύστημα έγκρισης πολλαπλών επιπέδων: Για παράδειγμα, έγκριση άδειας, έγκριση αγοράς κ.λπ., το αίτημα έγκρισης μεταβιβάζεται στον υπεύθυνο έγκρισης επόμενου επιπέδου σύμφωνα με την εξουσία και το επίπεδο του εγκρίοντος.

6. Παραδείγματα υλοποίησης

Το παρακάτω είναι ένα απλό παράδειγμα υλοποίησης του μοτίβου της αλυσίδας ευθύνης, το οποίο χρησιμοποιείται για την επεξεργασία μηνυμάτων καταγραφής και τη διαβίβαση των μηνυμάτων σε διαφορετικούς επεξεργαστές ανάλογα με το επίπεδο καταγραφής (όπως DEBUG, INFO, WARN, ERROR):

  1. // 抽象处理者
  2. abstract class LogHandler {
  3. protected int level;
  4. protected LogHandler nextHandler;
  5. public void setNextHandler(LogHandler nextHandler) {
  6. this.nextHandler = nextHandler;
  7. }
  8. //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
  9. public void logMessage(int level, String message) {
  10. if (this.level <= level) {
  11. write(message);
  12. }
  13. if (nextHandler != null) {
  14. nextHandler.logMessage(level, message);
  15. }
  16. }
  17. abstract protected void write(String message);
  18. }
  19. // 具体处理者:ErrorLogHandler
  20. class ErrorLogHandler extends LogHandler {
  21. public ErrorLogHandler(int level) {
  22. this.level = level;
  23. }
  24. @Override
  25. protected void write(String message) {
  26. System.out.println("ErrorLogHandler: " + message);
  27. }
  28. }
  29. // 具体处理者:WarnLogHandler
  30. class WarnLogHandler extends LogHandler {
  31. public WarnLogHandler(int level) {
  32. this.level = level;
  33. }
  34. @Override
  35. protected void write(String message) {
  36. System.out.println("WarnLogHandler: " + message);
  37. }
  38. }
  39. // 具体处理者:InfoLogHandler
  40. class InfoLogHandler extends LogHandler {
  41. public InfoLogHandler(int level) {
  42. this.level = level;
  43. }
  44. @Override
  45. protected void write(String message) {
  46. System.out.println("InfoLogHandler: " + message);
  47. }
  48. }
  49. // 客户端代码
  50. public class ChainPatternDemo {
  51. private static LogHandler getChainOfLoggers() {
  52. // 创建链中的处理者
  53. LogHandler errorLogHandler = new ErrorLogHandler(3);
  54. LogHandler warnLogHandler = new WarnLogHandler(2);
  55. warnLogHandler.setNextHandler(errorLogHandler);
  56. LogHandler infoLogHandler = new InfoLogHandler(1);
  57. infoLogHandler.setNextHandler(warnLogHandler);
  58. return infoLogHandler;
  59. }
  60. public static void main(String[] args) {
  61. LogHandler loggerChain = getChainOfLoggers();
  62. loggerChain.logMessage(1, "This is an informational message.");
  63. loggerChain.logMessage(2, "This is a warning message.");
  64. loggerChain.logMessage(3, "This is an error message.");
  65. }
  66. }

Σε αυτό το παράδειγμα, ορίζουμε τρεις συγκεκριμένες κατηγορίες χειριστή κορμών (ErrorLogHandlerWarnLogHandlerInfoLogHandler ), χειρίζονται διαφορετικά επίπεδα μηνυμάτων καταγραφής αντίστοιχα. Κάθε χειριστής περιέχει ένα επίπεδο (level ), χρησιμοποιείται για να προσδιορίσει εάν τα μηνύματα αυτού του επιπέδου θα πρέπει να υποβάλλονται σε επεξεργασία.Με την κλήσηlogMessageμέθοδο, το αίτημα μεταβιβάζεται στον πρώτο χειριστή στην αλυσίδα (infoLogHandler ), αποφασίζει εάν θα επεξεργαστεί το μήνυμα με βάση το δικό του επίπεδο και λογική επεξεργασίας και στη συνέχεια (αν δεν υποβληθεί σε επεξεργασία) μεταβιβάζει το αίτημα στον επόμενο επεξεργαστή της αλυσίδας. Αυτή η διαδικασία συνεχίζεται μέχρι το τέλος της αλυσίδας ή μέχρι να διεκπεραιωθεί το αίτημα.

Σημειώστε ότι σε μια πραγματική εφαρμογή, ίσως χρειαστείLogHandler Η κλάση προσθέτει περισσότερες μεθόδους και ιδιότητες για να υποστηρίξει πιο περίπλοκη λογική επεξεργασίας αρχείων καταγραφής και διαμόρφωση. Επιπλέον, τα επίπεδα καταγραφής συνήθως χρησιμοποιούν απαριθμήσεις (enum) αντί για ακέραιους για τη βελτίωση της αναγνωσιμότητας και της συντηρησιμότητας του κώδικα.

7. Συμπέρασμα

Το μοτίβο της αλυσίδας ευθύνης επιτυγχάνει ευέλικτη επεξεργασία αιτημάτων και επεκτασιμότητα του συστήματος συνδέοντας πολλαπλά αντικείμενα που χειρίζονται αιτήματα σε μια αλυσίδα και επιτρέποντας στο αίτημα να περάσει στην αλυσίδα έως ότου ένα αντικείμενο στην αλυσίδα αποφασίσει να χειριστεί το αίτημα.

Εάν το μοντέλο της αλυσίδας ευθύνης σας είναι χρήσιμο, θυμηθείτε να κάνετε like και να το συλλέξετε.