-
-
Notifications
You must be signed in to change notification settings - Fork 26.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Create Chain of Responsibility.md in French #3130
Open
Basmalamoustafa
wants to merge
1
commit into
iluwatar:master
Choose a base branch
from
Basmalamoustafa:patch-2
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,238 @@ | ||
--- | ||
title: "Le Modèle Chaîne de Responsabilité en Java : Construire des Mécanismes Robustes de Gestion des Requêtes" | ||
shortTitle: Chaîne de Responsabilité | ||
description: "Apprenez le modèle de conception Chaîne de Responsabilité en Java avec des exemples concrets, des extraits de code et des diagrammes de classes. Améliorez vos compétences en codage grâce à nos explications détaillées." | ||
category: Comportemental | ||
language: fr | ||
tag: | ||
- Découplage | ||
- Événementiel | ||
- Gang of Four | ||
- Messagerie | ||
--- | ||
|
||
## Aussi connu sous le nom de | ||
|
||
* Chaîne de Commande | ||
* Chaîne d'Objets | ||
* Chaîne de Responsabilité | ||
|
||
## Intention du Modèle de Conception Chaîne de Responsabilité | ||
|
||
Le modèle Chaîne de Responsabilité en Java est un modèle de conception comportemental qui découple l'expéditeur d'une requête de ses récepteurs en donnant à plusieurs objets la possibilité de traiter la requête. Les objets récepteurs sont enchaînés, et la requête est transmise le long de la chaîne jusqu'à ce qu'un objet la traite. | ||
|
||
## Explication Détaillée du Modèle Chaîne de Responsabilité avec des Exemples Concrets | ||
|
||
Exemple concret | ||
|
||
> Un exemple concret du modèle Chaîne de Responsabilité en Java est un centre d'assistance technique. Lors de la mise en œuvre de ce modèle en Java, chaque niveau de support représente un gestionnaire dans la chaîne. Lorsqu'un client appelle pour un problème, l'appel est d'abord reçu par un représentant de support de premier niveau. Si le problème est simple, le représentant le gère directement. Si le problème est plus complexe, l'appel est transmis à un technicien de support de deuxième niveau. Ce processus continue, l'appel étant escaladé à travers plusieurs niveaux de support jusqu'à atteindre un spécialiste capable de résoudre le problème. Chaque niveau de support représente un gestionnaire dans la chaîne, et l'appel est transmis le long de celle-ci jusqu'à ce qu'il trouve un gestionnaire approprié, découplant ainsi la requête de son récepteur spécifique. | ||
|
||
En termes simples | ||
|
||
> Cela aide à construire une chaîne d'objets. Une requête entre par un bout et passe d'un objet à un autre jusqu'à ce qu'elle trouve un gestionnaire adapté. | ||
|
||
Wikipedia dit | ||
|
||
> En conception orientée objet, le modèle de conception Chaîne de Responsabilité est un modèle qui consiste en une source d'objets de commande et une série d'objets de traitement. Chaque objet de traitement contient une logique qui définit les types d'objets de commande qu'il peut traiter ; les autres sont transmis au prochain objet de traitement dans la chaîne. | ||
|
||
## Exemple Programmable du Modèle Chaîne de Responsabilité | ||
|
||
Dans cet exemple Java, le Roi Orc donne des ordres qui sont traités par une chaîne de commandement représentant le modèle Chaîne de Responsabilité. Apprenez à implémenter ce modèle en Java avec l'extrait de code suivant. | ||
|
||
Le Roi Orc donne des ordres forts à son armée. Le plus proche pour réagir est le commandant, puis un officier, et enfin un soldat. Le commandant, l'officier et le soldat forment une chaîne de responsabilité. | ||
|
||
D'abord, nous avons la classe `Request` : | ||
|
||
```java | ||
@Getter | ||
public class Request { | ||
|
||
private final RequestType requestType; | ||
private final String requestDescription; | ||
private boolean handled; | ||
|
||
public Request(final RequestType requestType, final String requestDescription) { | ||
this.requestType = Objects.requireNonNull(requestType); | ||
this.requestDescription = Objects.requireNonNull(requestDescription); | ||
} | ||
|
||
public void markHandled() { | ||
this.handled = true; | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return getRequestDescription(); | ||
} | ||
} | ||
|
||
public enum RequestType { | ||
DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX | ||
} | ||
``` | ||
Ensuite, nous montrons la hiérarchie des RequestHandler. | ||
```java | ||
public interface RequestHandler { | ||
|
||
boolean canHandleRequest(Request req); | ||
|
||
int getPriority(); | ||
|
||
void handle(Request req); | ||
|
||
String name(); | ||
} | ||
|
||
@Slf4j | ||
public class OrcCommander implements RequestHandler { | ||
@Override | ||
public boolean canHandleRequest(Request req) { | ||
return req.getRequestType() == RequestType.DEFEND_CASTLE; | ||
} | ||
|
||
@Override | ||
public int getPriority() { | ||
return 2; | ||
} | ||
|
||
@Override | ||
public void handle(Request req) { | ||
req.markHandled(); | ||
LOGGER.info("{} handling request \"{}\"", name(), req); | ||
} | ||
|
||
@Override | ||
public String name() { | ||
return "Commandant Orc"; | ||
} | ||
} | ||
|
||
// OrcOfficer et OrcSoldier sont définis de manière similaire à OrcCommander ... | ||
``` | ||
Ensuite, nous montrons la hiérarchie des RequestHandler. | ||
```java | ||
public interface RequestHandler { | ||
|
||
boolean canHandleRequest(Request req); | ||
|
||
int getPriority(); | ||
|
||
void handle(Request req); | ||
|
||
String name(); | ||
} | ||
|
||
@Slf4j | ||
public class OrcCommander implements RequestHandler { | ||
@Override | ||
public boolean canHandleRequest(Request req) { | ||
return req.getRequestType() == RequestType.DEFEND_CASTLE; | ||
} | ||
|
||
@Override | ||
public int getPriority() { | ||
return 2; | ||
} | ||
|
||
@Override | ||
public void handle(Request req) { | ||
req.markHandled(); | ||
LOGGER.info("{} handling request \"{}\"", name(), req); | ||
} | ||
|
||
@Override | ||
public String name() { | ||
return "Commandant Orc"; | ||
} | ||
} | ||
|
||
// OrcOfficer et OrcSoldier sont définis de manière similaire à OrcCommander ... | ||
``` | ||
Le OrcKing donne les ordres et forme la chaîne. | ||
```java | ||
public class OrcKing { | ||
|
||
private List<RequestHandler> handlers; | ||
|
||
public OrcKing() { | ||
buildChain(); | ||
} | ||
|
||
private void buildChain() { | ||
handlers = Arrays.asList(new OrcCommander(), new OrcOfficer(), new OrcSoldier()); | ||
} | ||
|
||
public void makeRequest(Request req) { | ||
handlers | ||
.stream() | ||
.sorted(Comparator.comparing(RequestHandler::getPriority)) | ||
.filter(handler -> handler.canHandleRequest(req)) | ||
.findFirst() | ||
.ifPresent(handler -> handler.handle(req)); | ||
} | ||
} | ||
``` | ||
La chaîne de responsabilité en action. | ||
```java | ||
public static void main(String[] args) { | ||
|
||
var king = new OrcKing(); | ||
king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "défendre le château")); | ||
king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torturer un prisonnier")); | ||
king.makeRequest(new Request(RequestType.COLLECT_TAX, "collecter des impôts")); | ||
} | ||
``` | ||
La sortie console : | ||
```java | ||
Commandant Orc traitant la requête "défendre le château" | ||
Officier Orc traitant la requête "torturer un prisonnier" | ||
Soldat Orc traitant la requête "collecter des impôts" | ||
``` | ||
## Diagramme de Classe du Modèle Chaîne de Responsabilité | ||
|
||
![Chaîne de Responsabilité](./etc/chain-of-responsibility.urm.png "Chain of Responsibility class diagram") | ||
|
||
## Quand Utiliser le Modèle Chaîne de Responsabilité en Java | ||
|
||
Utilisez le modèle Chaîne de Responsabilité lorsque : | ||
|
||
* Plus d'un objet peut traiter une requête, et le gestionnaire n'est pas connu à l'avance. Le gestionnaire doit être déterminé automatiquement. | ||
* Vous souhaitez émettre une requête à l'un des nombreux objets sans spécifier explicitement le récepteur. | ||
* L'ensemble des objets pouvant traiter une requête doit être spécifié dynamiquement. | ||
|
||
|
||
## Applications Réelles du Modèle Chaîne de Responsabilité en Java | ||
|
||
* La propagation d'événements dans les frameworks GUI, où un événement peut être traité à plusieurs niveaux d'une hiérarchie de composants UI. | ||
* Les frameworks middleware où une requête passe par une chaîne d'objets de traitement. | ||
* Les frameworks de journalisation où les messages peuvent être passés à travers une série de loggers, chacun les traitant différemment. | ||
* [java.util.logging.Logger#log()](http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html#log%28java.util.logging.Level,%20java.lang.String%29) | ||
* [Apache Commons Chain](https://commons.apache.org/proper/commons-chain/index.html) | ||
* [javax.servlet.Filter#doFilter()](http://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html#doFilter-javax.servlet.ServletRequest-javax.servlet.ServletResponse-javax.servlet.FilterChain-) | ||
|
||
## Avantages et Inconvénients du Modèle Chaîne de Responsabilité | ||
|
||
Avantages : | ||
|
||
* Couplage réduit. L'expéditeur d'une requête n'a pas besoin de connaître le gestionnaire concret qui traitera la requête. | ||
* Flexibilité accrue dans l'attribution des responsabilités aux objets. Vous pouvez ajouter ou modifier les responsabilités pour traiter une requête en changeant les membres et l'ordre de la chaîne. | ||
* Permet de définir un gestionnaire par défaut si aucun gestionnaire concret ne peut traiter la requête. | ||
|
||
Inconvénients : | ||
|
||
* Il peut être difficile de déboguer et de comprendre le flux, en particulier si la chaîne est longue et complexe. | ||
La requête pourrait rester non traitée si la chaîne ne comprend pas de gestionnaire universel. | ||
Des problèmes de performance peuvent survenir en raison du passage par plusieurs gestionnaires avant de trouver le bon, ou de ne pas le trouver du tout. | ||
## Related Java Design Patterns | ||
|
||
* [Command](https://java-design-patterns.com/patterns/command/): peut être utilisé pour encapsuler une requête en tant qu'objet, qui pourrait être passé le long de la chaîne. | ||
* [Composite](https://java-design-patterns.com/patterns/composite/): la Chaîne de Responsabilité est souvent appliquée conjointement avec le modèle Composite. | ||
* [Decorator](https://java-design-patterns.com/patterns/decorator/): les décorateurs peuvent être enchaînés de manière similaire aux responsabilités dans le modèle Chaîne de Responsabilité. | ||
|
||
## Références et Crédits | ||
|
||
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI) | ||
* [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/49NGldq) | ||
* [Pattern-Oriented Software Architecture, Volume 1: A System of Patterns](https://amzn.to/3PAJUg5) | ||
* [Refactoring to Patterns](https://amzn.to/3VOO4F5) | ||
* [Pattern languages of program design 3](https://amzn.to/4a4NxTH) |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Category and tag values are not supposed to be translated