2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Le modèle de chaîne de responsabilité est un modèle de conception comportemental qui permet à plusieurs objets de gérer les demandes en séquence, et chaque objet peut choisir de gérer la demande ou de la transmettre à l'objet suivant. Ce modèle offre une plus grande flexibilité et évolutivité en dissociant l'expéditeur et le destinataire des requêtes. Ce qui suit est une introduction détaillée au modèle de chaîne de responsabilité :
Le cœur du modèle de chaîne de responsabilité consiste à concevoir une chaîne de demande et à identifier la fin de la chaîne. Il connecte plusieurs objets de gestion de requêtes dans une chaîne et permet à la requête de passer dans la chaîne jusqu'à ce qu'un objet de la chaîne décide de gérer la requête. Le client qui fait la demande ne sait pas quel objet de la chaîne traitera finalement la demande, ce qui permet au système de se réorganiser et d'attribuer dynamiquement les responsabilités sans affecter le client.
Diagramme de classes :
Le modèle de chaîne de responsabilité comprend principalement les rôles suivants :
Gestionnaire abstrait (gestionnaire) : Définir une interface de traitement des requêtes. Si nécessaire, l'interface peut définir une méthode pour définir et renvoyer une référence à l'interface suivante. Ce rôle est généralement implémenté par une classe abstraite ou une interface.
Manipulateur de béton : Après avoir reçu la demande, le processeur spécifique peut choisir de traiter la demande ou de transmettre la demande à la partie suivante. Étant donné que le processeur de béton détient une référence à la maison suivante, il peut accéder à la maison suivante si nécessaire.
Classe client (Client): Créez une chaîne de traitement et soumettez une requête à l'objet processeur spécifique du responsable de la chaîne.
Le modèle de chaîne de responsabilité convient aux scénarios suivants :
Plusieurs objets traitent conjointement une tâche: Par exemple, un système d'approbation à plusieurs niveaux transmet la demande d'approbation au niveau d'approbateur suivant en fonction de l'autorité et du niveau de l'approbateur jusqu'à ce que le résultat final de l'approbation soit obtenu.
Flux de traitement de combinaison dynamique: En configurant de manière flexible la chaîne de responsabilité, les objets de traitement peuvent être combinés dynamiquement pour mettre en œuvre différents processus de traitement.
Évitez le couplage direct entre l’expéditeur et le destinataire d’une requête: En transmettant la demande à la chaîne de responsabilité, l'expéditeur de la demande n'a pas besoin de connaître l'objet de traitement spécifique, ce qui réduit la dépendance entre les objets.
Le modèle de chaîne de responsabilité est largement utilisé dans de nombreux domaines, notamment :
Ce qui suit est un exemple simple d'implémentation du modèle de chaîne de responsabilité, qui est utilisé pour traiter les messages de journal et transmettre les messages à différents processeurs en fonction du niveau de journalisation (tel que 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.");
- }
- }
Dans cet exemple, nous définissons trois classes concrètes de gestionnaire de journaux (ErrorLogHandler
、WarnLogHandler
、InfoLogHandler
), ils gèrent respectivement différents niveaux de messages de journal. Chaque gestionnaire contient un niveau (level
), utilisé pour déterminer si les messages de ce niveau doivent être traités.En appelantlogMessage
méthode, la requête est transmise au premier gestionnaire de la chaîne (infoLogHandler
), il décide s'il doit traiter le message en fonction de son propre niveau et de sa logique de traitement, puis (s'il n'est pas traité) transmet la demande au processeur suivant de la chaîne. Ce processus se poursuit jusqu'à la fin de la chaîne ou jusqu'à ce que la demande soit traitée.
Notez que dans une application réelle, vous devrez peut-êtreLogHandler
La classe ajoute davantage de méthodes et de propriétés pour prendre en charge une logique et une configuration de traitement des journaux plus complexes. De plus, les niveaux de journalisation utilisent généralement des énumérations (enum
) au lieu de nombres entiers pour améliorer la lisibilité et la maintenabilité du code.
Le modèle de chaîne de responsabilité permet un traitement flexible des demandes et une évolutivité du système en connectant plusieurs objets qui gèrent les demandes dans une chaîne et en permettant aux demandes de passer le long de la chaîne jusqu'à ce qu'un objet de la chaîne décide de traiter la demande.
Si le modèle de chaîne de responsabilité vous est utile, pensez à l'aimer et à le sauvegarder.