|
| 1 | +title: "Patron de Rappel (Callback) en Java : Maîtriser la Communication Asynchrone" |
| 2 | +shortTitle: Callback |
| 3 | +description: "Découvrez le Patron de Conception Callback en Java, incluant son objectif, ses scénarios d'utilisation, ses avantages, ses inconvénients, et des exemples concrets. Comprenez comment implémenter et utiliser efficacement les rappels dans vos applications Java." |
| 4 | +category: Fonctionnel |
| 5 | +language: fr |
| 6 | +tag: |
| 7 | + - Asynchrone |
| 8 | + - Découplage |
| 9 | + - Idiome |
| 10 | + - Réactif |
| 11 | +--- |
| 12 | + |
| 13 | +## Aussi connu sous le nom de |
| 14 | + |
| 15 | +* Appel-Après |
| 16 | +* Abonnement-Événement |
| 17 | +* Écouteur |
| 18 | + |
| 19 | +## Objectif du Patron de Conception Callback |
| 20 | + |
| 21 | +Le Patron de Conception Callback en Java est un morceau de code exécutable passé comme argument à un autre code, qui est censé rappeler (exécuter) cet argument à un moment opportun. |
| 22 | + |
| 23 | +## Explication détaillée du Patron Callback avec des exemples concrets |
| 24 | + |
| 25 | +Exemple concret |
| 26 | + |
| 27 | +> Une analogie dans le monde réel pour le patron de conception Callback peut être trouvée dans l'industrie de la restauration. Imaginez une situation où vous passez une commande dans un restaurant bondé. Au lieu d'attendre au comptoir que votre plat soit prêt, vous fournissez votre numéro de téléphone au caissier. Une fois que votre commande est prête, le personnel de cuisine vous appelle ou vous envoie un SMS pour vous informer que votre repas est prêt à être récupéré. |
| 28 | +> |
| 29 | +> Dans cette analogie, passer votre commande est analogue à l'initiation d'une tâche asynchrone. Fournir votre numéro de téléphone revient à transmettre une fonction de rappel. La préparation de votre commande par la cuisine représente le traitement asynchrone, et la notification que vous recevez correspond à l'exécution du rappel, vous permettant de récupérer votre repas sans avoir à attendre passivement. Cette séparation entre l'initiation et l'achèvement d'une tâche est l'essence même du patron de conception Callback. |
| 30 | + |
| 31 | +En termes simples |
| 32 | + |
| 33 | +> Un rappel est une méthode passée à un exécuteur qui sera appelée à un moment défini. |
| 34 | + |
| 35 | +Wikipedia dit |
| 36 | + |
| 37 | +> En programmation informatique, un rappel (callback), aussi connu comme une fonction "appel-après", est tout code exécutable qui est passé comme un argument à un autre code ; ce dernier est censé rappeler (exécuter) l'argument à un moment donné. |
| 38 | + |
| 39 | +## Exemple programmatique du Patron Callback en Java |
| 40 | + |
| 41 | +Nous devons être informés après que la tâche exécutée est terminée. Nous transmettons une méthode de rappel à l'exécuteur et attendons qu'il nous rappelle. |
| 42 | + |
| 43 | +`Callback` est une interface simple avec une seule méthode. |
| 44 | + |
| 45 | +```java |
| 46 | +public interface Callback { |
| 47 | + |
| 48 | + void call(); |
| 49 | +} |
| 50 | +Ensuite, nous définissons une classe Task qui exécutera le rappel après l'exécution de la tâche. |
| 51 | +public abstract class Task { |
| 52 | + |
| 53 | + final void executeWith(Callback callback) { |
| 54 | + execute(); |
| 55 | + Optional.ofNullable(callback).ifPresent(Callback::call); |
| 56 | + } |
| 57 | + |
| 58 | + public abstract void execute(); |
| 59 | +} |
| 60 | + |
| 61 | +@Slf4j |
| 62 | +public final class SimpleTask extends Task { |
| 63 | + |
| 64 | + @Override |
| 65 | + public void execute() { |
| 66 | + LOGGER.info("Effectuer une activité importante puis appeler la méthode de rappel."); |
| 67 | + } |
| 68 | +} |
| 69 | +Enfin, voici comment nous exécutons une tâche et recevons un rappel lorsqu'elle est terminée. |
| 70 | +public static void main(final String[] args) { |
| 71 | + var task = new SimpleTask(); |
| 72 | + task.executeWith(() -> LOGGER.info("C'est terminé maintenant.")); |
| 73 | +} |
| 74 | +Sortie du programme : |
| 75 | +17:12:11.680 [main] INFO com.iluwatar.callback.SimpleTask -- Effectuer une activité importante puis appeler la méthode de rappel. |
| 76 | +17:12:11.682 [main] INFO com.iluwatar.callback.App -- C'est terminé maintenant. |
| 77 | + |
| 78 | +## Quand utiliser le modèle Callback en Java |
| 79 | + |
| 80 | +Utilisez le modèle Callback lorsque : |
| 81 | + |
| 82 | +* Gestion d'événements asynchrones dans les applications GUI ou les systèmes orientés événements |
| 83 | +* Mise en œuvre de mécanismes de notification où certains événements doivent déclencher des actions dans d'autres composants |
| 84 | +* Découplage des modules ou composants qui doivent interagir sans avoir une dépendance directe |
| 85 | + |
| 86 | +## Applications réelles du modèle Callback en Java |
| 87 | + |
| 88 | +* Les frameworks GUI utilisent souvent des callbacks pour la gestion des événements, comme les interactions utilisateur (clics, pressions de touches) |
| 89 | +* Node.js repose fortement sur les callbacks pour les opérations d'I/O non bloquantes |
| 90 | +* Les frameworks traitant des opérations asynchrones, comme les Promises en JavaScript, utilisent des callbacks pour gérer la résolution ou le rejet des tâches asynchrones |
| 91 | +* Le constructeur [CyclicBarrier](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html#CyclicBarrier%28int,%20java.lang.Runnable%29) peut accepter un callback déclenché chaque fois qu'une barrière est atteinte. |
| 92 | + |
| 93 | +## Avantages et compromis du modèle Callback |
| 94 | + |
| 95 | +Avantages : |
| 96 | + |
| 97 | +* Découple la logique d'exécution d'une opération de la logique de signalement ou de notification, améliorant la modularité et la réutilisabilité |
| 98 | +* Facilite le traitement asynchrone, améliorant la réactivité et l'évolutivité des applications |
| 99 | +* Permet un modèle de programmation réactive où les composants peuvent réagir aux événements au fur et à mesure qu'ils se produisent |
| 100 | + |
| 101 | +Compromis : |
| 102 | + |
| 103 | +* Callback hell ou pyramide de la mort : Les callbacks imbriqués en profondeur peuvent rendre le code difficile à lire et à maintenir |
| 104 | +* L'inversion de contrôle peut entraîner un flux de code plus difficile à suivre, rendant le débogage plus complexe |
| 105 | +* Problèmes potentiels de gestion des erreurs, en particulier dans les langages ou environnements où des exceptions sont utilisées, car les erreurs doivent être propagées à travers les callbacks |
| 106 | + |
| 107 | +## Modèles de conception Java connexes |
| 108 | + |
| 109 | +* [Command](https://java-design-patterns.com/patterns/command/): Les callbacks peuvent être implémentés comme des objets Command dans des scénarios nécessitant plus de flexibilité ou d'état dans l'opération de callback |
| 110 | +* [Observer](https://java-design-patterns.com/patterns/observer/): Les callbacks peuvent être vus comme une forme plus dynamique et légère du modèle Observer, avec la possibilité de s'abonner et de se désabonner dynamiquement des fonctions de callback |
| 111 | +* [Promise](https://java-design-patterns.com/patterns/promise/): Dans certains langages ou frameworks, les Promises ou Futures peuvent être utilisées pour gérer les opérations asynchrones plus proprement, souvent en utilisant des callbacks pour les cas de succès ou d'échec |
| 112 | + |
| 113 | +## Références et crédits |
| 114 | + |
| 115 | +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI) |
| 116 | +* [Effective Java](https://amzn.to/4cGk2Jz) |
| 117 | +* [Java Concurrency in Practice](https://amzn.to/4aRMruW) |
0 commit comments