Skip to content

Commit 8b94916

Browse files
Create Chain of Responsibility.md
1 parent b375919 commit 8b94916

File tree

1 file changed

+238
-0
lines changed

1 file changed

+238
-0
lines changed
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
---
2+
title: "Le Modèle Chaîne de Responsabilité en Java : Construire des Mécanismes Robustes de Gestion des Requêtes"
3+
shortTitle: Chaîne de Responsabilité
4+
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."
5+
category: Comportemental
6+
language: fr
7+
tag:
8+
- Découplage
9+
- Événementiel
10+
- Gang of Four
11+
- Messagerie
12+
---
13+
14+
## Aussi connu sous le nom de
15+
16+
* Chaîne de Commande
17+
* Chaîne d'Objets
18+
* Chaîne de Responsabilité
19+
20+
## Intention du Modèle de Conception Chaîne de Responsabilité
21+
22+
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.
23+
24+
## Explication Détaillée du Modèle Chaîne de Responsabilité avec des Exemples Concrets
25+
26+
Exemple concret
27+
28+
> 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.
29+
30+
En termes simples
31+
32+
> 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é.
33+
34+
Wikipedia dit
35+
36+
> 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.
37+
38+
## Exemple Programmable du Modèle Chaîne de Responsabilité
39+
40+
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.
41+
42+
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é.
43+
44+
D'abord, nous avons la classe `Request` :
45+
46+
```java
47+
@Getter
48+
public class Request {
49+
50+
private final RequestType requestType;
51+
private final String requestDescription;
52+
private boolean handled;
53+
54+
public Request(final RequestType requestType, final String requestDescription) {
55+
this.requestType = Objects.requireNonNull(requestType);
56+
this.requestDescription = Objects.requireNonNull(requestDescription);
57+
}
58+
59+
public void markHandled() {
60+
this.handled = true;
61+
}
62+
63+
@Override
64+
public String toString() {
65+
return getRequestDescription();
66+
}
67+
}
68+
69+
public enum RequestType {
70+
DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX
71+
}
72+
```
73+
Ensuite, nous montrons la hiérarchie des RequestHandler.
74+
```java
75+
public interface RequestHandler {
76+
77+
boolean canHandleRequest(Request req);
78+
79+
int getPriority();
80+
81+
void handle(Request req);
82+
83+
String name();
84+
}
85+
86+
@Slf4j
87+
public class OrcCommander implements RequestHandler {
88+
@Override
89+
public boolean canHandleRequest(Request req) {
90+
return req.getRequestType() == RequestType.DEFEND_CASTLE;
91+
}
92+
93+
@Override
94+
public int getPriority() {
95+
return 2;
96+
}
97+
98+
@Override
99+
public void handle(Request req) {
100+
req.markHandled();
101+
LOGGER.info("{} handling request \"{}\"", name(), req);
102+
}
103+
104+
@Override
105+
public String name() {
106+
return "Commandant Orc";
107+
}
108+
}
109+
110+
// OrcOfficer et OrcSoldier sont définis de manière similaire à OrcCommander ...
111+
```
112+
Ensuite, nous montrons la hiérarchie des RequestHandler.
113+
```java
114+
public interface RequestHandler {
115+
116+
boolean canHandleRequest(Request req);
117+
118+
int getPriority();
119+
120+
void handle(Request req);
121+
122+
String name();
123+
}
124+
125+
@Slf4j
126+
public class OrcCommander implements RequestHandler {
127+
@Override
128+
public boolean canHandleRequest(Request req) {
129+
return req.getRequestType() == RequestType.DEFEND_CASTLE;
130+
}
131+
132+
@Override
133+
public int getPriority() {
134+
return 2;
135+
}
136+
137+
@Override
138+
public void handle(Request req) {
139+
req.markHandled();
140+
LOGGER.info("{} handling request \"{}\"", name(), req);
141+
}
142+
143+
@Override
144+
public String name() {
145+
return "Commandant Orc";
146+
}
147+
}
148+
149+
// OrcOfficer et OrcSoldier sont définis de manière similaire à OrcCommander ...
150+
```
151+
Le OrcKing donne les ordres et forme la chaîne.
152+
```java
153+
public class OrcKing {
154+
155+
private List<RequestHandler> handlers;
156+
157+
public OrcKing() {
158+
buildChain();
159+
}
160+
161+
private void buildChain() {
162+
handlers = Arrays.asList(new OrcCommander(), new OrcOfficer(), new OrcSoldier());
163+
}
164+
165+
public void makeRequest(Request req) {
166+
handlers
167+
.stream()
168+
.sorted(Comparator.comparing(RequestHandler::getPriority))
169+
.filter(handler -> handler.canHandleRequest(req))
170+
.findFirst()
171+
.ifPresent(handler -> handler.handle(req));
172+
}
173+
}
174+
```
175+
La chaîne de responsabilité en action.
176+
```java
177+
public static void main(String[] args) {
178+
179+
var king = new OrcKing();
180+
king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "défendre le château"));
181+
king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torturer un prisonnier"));
182+
king.makeRequest(new Request(RequestType.COLLECT_TAX, "collecter des impôts"));
183+
}
184+
```
185+
La sortie console :
186+
```java
187+
Commandant Orc traitant la requête "défendre le château"
188+
Officier Orc traitant la requête "torturer un prisonnier"
189+
Soldat Orc traitant la requête "collecter des impôts"
190+
```
191+
## Diagramme de Classe du Modèle Chaîne de Responsabilité
192+
193+
![Chaîne de Responsabilité](./etc/chain-of-responsibility.urm.png "Chain of Responsibility class diagram")
194+
195+
## Quand Utiliser le Modèle Chaîne de Responsabilité en Java
196+
197+
Utilisez le modèle Chaîne de Responsabilité lorsque :
198+
199+
* 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.
200+
* Vous souhaitez émettre une requête à l'un des nombreux objets sans spécifier explicitement le récepteur.
201+
* L'ensemble des objets pouvant traiter une requête doit être spécifié dynamiquement.
202+
203+
204+
## Applications Réelles du Modèle Chaîne de Responsabilité en Java
205+
206+
* 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.
207+
* Les frameworks middleware où une requête passe par une chaîne d'objets de traitement.
208+
* Les frameworks de journalisation où les messages peuvent être passés à travers une série de loggers, chacun les traitant différemment.
209+
* [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)
210+
* [Apache Commons Chain](https://commons.apache.org/proper/commons-chain/index.html)
211+
* [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-)
212+
213+
## Avantages et Inconvénients du Modèle Chaîne de Responsabilité
214+
215+
Avantages :
216+
217+
* 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.
218+
* 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.
219+
* Permet de définir un gestionnaire par défaut si aucun gestionnaire concret ne peut traiter la requête.
220+
221+
Inconvénients :
222+
223+
* Il peut être difficile de déboguer et de comprendre le flux, en particulier si la chaîne est longue et complexe.
224+
La requête pourrait rester non traitée si la chaîne ne comprend pas de gestionnaire universel.
225+
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.
226+
## Related Java Design Patterns
227+
228+
* [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.
229+
* [Composite](https://java-design-patterns.com/patterns/composite/): la Chaîne de Responsabilité est souvent appliquée conjointement avec le modèle Composite.
230+
* [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é.
231+
232+
## Références et Crédits
233+
234+
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI)
235+
* [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/49NGldq)
236+
* [Pattern-Oriented Software Architecture, Volume 1: A System of Patterns](https://amzn.to/3PAJUg5)
237+
* [Refactoring to Patterns](https://amzn.to/3VOO4F5)
238+
* [Pattern languages of program design 3](https://amzn.to/4a4NxTH)

0 commit comments

Comments
 (0)