{"id":251,"date":"2021-08-25T20:52:41","date_gmt":"2021-08-25T20:52:41","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=251"},"modified":"2024-09-06T15:12:27","modified_gmt":"2024-09-06T15:12:27","slug":"objet2-patrons-conceptuels","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/objet2-patrons-conceptuels\/","title":{"rendered":"Patrons conceptuels"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>On appelle <strong>patrons conceptuels<\/strong> (ou \u00ab\u00a0<strong>Design pattern<\/strong> \u00ab\u00a0) un arrangement \u00e9prouv\u00e9 de classes afin de r\u00e9pondre \u00e0 un probl\u00e8me classique. Un patron de conception est consid\u00e9r\u00e9 comme un ensemble de bonnes pratiques dans le domaine du d\u00e9veloppement logiciel.<\/p>\n<h2>Les patrons de cr\u00e9ation<\/h2>\n<h3>Singleton<\/h3>\n<p>Un <strong>singleton<\/strong> est une instance unique d&rsquo;une classe dans un programme.<\/p>\n<p>On utilise un singleton dans le cas o\u00f9 il est souhaitable ou obligatoire qu&rsquo;une classe n&rsquo;ait qu&rsquo;une seule instance dans l&rsquo;ex\u00e9cution du programme.<\/p>\n<p>Afin de garder le contr\u00f4le sur l&rsquo;utilisation de ce singleton (et ainsi \u00e9viter les probl\u00e8mes de variables globales), le singleton doit avoir un point d&rsquo;acc\u00e8s unique, tra\u00e7able et document\u00e9.<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.ArrayList<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MonSingleton<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">private<\/span> <span class=\"n\">MonSingleton<\/span> <span class=\"n\">instance<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">public<\/span> <span class=\"n\">MonSingleton<\/span> <span class=\"nf\">getInstance<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">instance<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">instance<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MonSingleton<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">instance<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"nf\">MonSingleton<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"n\">attribut1<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">attribut2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">attribut1<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">protected<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">attribut2<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setAttribut1<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aAttribut1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">attribut1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aAttribut1<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getAttribut1<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">attribut1<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setAttribut2<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aAttribut2<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">attribut2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">(<\/span><span class=\"n\">aAttribut2<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">getAttribut2<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">(<\/span><span class=\"n\">attribut2<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Les trois (3) \u00e9l\u00e9ments importants de cet exemple sont les trois (3) premiers attributs et m\u00e9thodes de la classe.<\/p>\n<p>En premier lieu, l&rsquo;attribut priv\u00e9 statique \u00ab\u00a0instance\u00a0\u00bb permet de placer l&rsquo;instance unique de la classe \u00ab\u00a0MonSingleton\u00a0\u00bb dans un attribut statique. Un attribut statique repr\u00e9sente la m\u00eame valeur, peu importe d&rsquo;o\u00f9 elle est acc\u00e9d\u00e9. \u00c7a permet \u00e9galement d&rsquo;utiliser l&rsquo;attribut \u00e0 partir d&rsquo;une m\u00e9thode statique.<\/p>\n<p>La m\u00e9thode publique statique \u00ab\u00a0getInstance\u00a0\u00bb permet aux autres classes du syst\u00e8me d&rsquo;acc\u00e9der \u00e0 l&rsquo;instance du singleton sans n\u00e9cessairement permettre l&rsquo;acc\u00e8s global de l&rsquo;attribut \u00ab\u00a0instance\u00a0\u00bb (afin d&rsquo;\u00e9viter qu&rsquo;une autre classe y assigne une valeur). On peut \u00e9galement voir que la m\u00e9thode \u00ab\u00a0getInstance\u00a0\u00bb regarde si l&rsquo;instance existe avant de le retourner et si l&rsquo;instance n&rsquo;existe pas, il le cr\u00e9e. On appelle cette technique le \u00ab\u00a0Lazy Loading\u00a0\u00bb. Il est \u00e9galement important de noter qu&rsquo;il n&rsquo;est pas n\u00e9cessaire d&rsquo;avoir une instance de classe pour lancer une m\u00e9thode statique. Il est possible de faire un appel de m\u00e9thode, appliqu\u00e9 directement sur la classe.<\/p>\n<p>Finalement, on voit que le constructeur de la classe \u00ab\u00a0MonSingleton\u00a0\u00bb est d\u00e9clar\u00e9 comme priv\u00e9. Cette fonctionnalit\u00e9 permet de nous assurer que le constructeur ne sera pas lanc\u00e9 \u00e0 partir d&rsquo;une autre classe que la classe en cours (dans ce cas, \u00ab\u00a0MonSingleton\u00a0\u00bb).<\/p>\n<p>On utilise le singleton de la mani\u00e8re suivante:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">MonSingleton<\/span> <span class=\"n\">monSingleton<\/span> <span class=\"o\">=<\/span> <span class=\"n\">MonSingleton<\/span><span class=\"p\">.<\/span><span class=\"na\">getInstance<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">monSingleton<\/span><span class=\"p\">.<\/span><span class=\"na\">setAttribut1<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">MON_SINGLETON<\/span>\r\n\r\n<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">MON_SINGLETON_SHARED<\/span><span class=\"p\">}<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">attribut1<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">0<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARRAYED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">}<\/span> <span class=\"n\">internal_attribut2<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Access<\/span>\r\n\r\n\t<span class=\"n\">attribut1<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_attribut1<\/span>\r\n\r\n\t<span class=\"n\">set_attribut1<\/span><span class=\"p\">(<\/span><span class=\"n\">a_attribut1<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">attribut1<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_attribut1<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">attribut2<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_attribut2<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">internal_attribut2<\/span><span class=\"p\">.<\/span><span class=\"n\">twin<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">set_attribut2<\/span><span class=\"p\">(<\/span><span class=\"n\">a_attribut2<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARRAYED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">}<\/span>\r\n\t\t\t\t<span class=\"n\">internal_attribut2<\/span><span class=\"p\">.<\/span><span class=\"n\">make_from_iterable<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_attribut2<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">internal_attribut2<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>La classe \u00ab\u00a0MON_SINGLETON\u00a0\u00bb est une classe compl\u00e8tement standard. La seule et unique particularit\u00e9 \u00e0 observer est l&rsquo;utilisation d&rsquo;un constructeur ami avec la classe \u00ab\u00a0MON_SINGLETON_SHARED\u00a0\u00bb:<\/p>\n<pre>create {MON_SINGLETON_SHARED}\r\n\tmake<\/pre>\n<p>La classe permettant le point d&rsquo;acc\u00e8s au singleton est la classe \u00ab\u00a0MON_SINGLETON_SHARED\u00a0\u00bb qui est faite de cette mani\u00e8re:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">MON_SINGLETON_SHARED<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Implementation<\/span>\r\n\r\n\t<span class=\"n\">mon_singleton<\/span><span class=\"p\">:<\/span><span class=\"nc\">MON_SINGLETON<\/span>\r\n\t\t<span class=\"kr\">once<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"kc\">Result<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>La particularit\u00e9 ici, est le mot cl\u00e9 \u00ab\u00a0once\u00a0\u00bb qui agit d&rsquo;une mani\u00e8re similaire au \u00ab\u00a0static\u00a0\u00bb de java (pour les m\u00e9thodes seulement, pas les attributs). Ce qu&rsquo;une m\u00e9thode \u00ab\u00a0once\u00a0\u00bb fait, c&rsquo;est qu&rsquo;elle ex\u00e9cute la m\u00e9thode une seule fois dans le programme et si cette m\u00e9thode retourne une valeur, donc la valeur retourn\u00e9e sera toujours la m\u00eame.<\/p>\n<p>Finalement, pour acc\u00e9der au singleton, il ne reste qu&rsquo;\u00e0 h\u00e9riter de la classe \u00ab\u00a0MON_SINGLETON_SHARED\u00a0\u00bb et d&rsquo;utiliser la m\u00e9thode \u00ab\u00a0mon_singleton\u00a0\u00bb. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">MON_SINGLETON_SHARED<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Ex\u00e9cute l'application.<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">mon_singleton<\/span><span class=\"p\">.<\/span><span class=\"n\">set_attribut1<\/span> <span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h4>\u00c0 noter \u00e0 propos des singletons<\/h4>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Il est important de prendre en note que l&rsquo;instance cr\u00e9\u00e9e dans le cas d&rsquo;un singleton sera en m\u00e9moire \u00e0 partir de sa premi\u00e8re utilisation et pour l&rsquo;enti\u00e8ret\u00e9 de l&rsquo;ex\u00e9cution du programme. En d&rsquo;autres mots, le ramasse-miette (\u00ab\u00a0garbage collector\u00a0\u00bb) ramassera seulement cet objet \u00e0 la fermeture du programme.\n<ul>\n<li>Cette note est particuli\u00e8rement importante dans le cas o\u00f9 le contenue du singleton est tr\u00e8s lourd en m\u00e9moire et peu utile.<\/li>\n<li>Cette note peut \u00e9galement \u00eatre importante dans le cas o\u00f9 le singleton utilise des ressources externes (fichiers, libraires charg\u00e9es dynamiquement, etc.) qui n\u00e9cessitent d&rsquo;\u00eatre lib\u00e9r\u00e9 avant la fin de l&rsquo;ex\u00e9cution du programme.<\/li>\n<\/ul>\n<\/li>\n<li>Une autre note importante est \u00e0 propos de l&rsquo;utilisation des singletons dans un contexte multithread. Puisque chaque objet en ex\u00e9cution partage le m\u00eame singleton, le risque de conflit augmente significativement.<\/li>\n<li>Enfin, il est important de comprendre que chaque langage a une mani\u00e8re propre qui permet de g\u00e9rer les singletons. Mais dans le cas o\u00f9 il n&rsquo;y a aucune mani\u00e8re de cr\u00e9er des singletons dans un langage, un singleton peut \u00e9galement \u00eatre un objet cr\u00e9\u00e9 dans le \u00ab\u00a0Main\u00a0\u00bb du programme et envoy\u00e9 en attribut aux constructeurs de tous les objets du syst\u00e8me.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Fabrique<\/h3>\n<p>Une <strong>fabrique<\/strong> (ou \u00ab\u00a0<strong>factory<\/strong>\u00ab\u00a0) est une classe (g\u00e9n\u00e9ralement un singleton), permettant la cr\u00e9ation de diff\u00e9rents types d&rsquo;objet. Une fabrique peut \u00eatre utile lorsqu&rsquo;on veut cacher l&rsquo;impl\u00e9mentation de la cr\u00e9ation d&rsquo;un certain type d&rsquo;objet, ou bien qu&rsquo;on veut \u00e9viter la duplication d&rsquo;objet dans le syst\u00e8me. Exemple:<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">BlocFabrique<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">BlocFabrique<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">imageBlocVert<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Image<\/span><span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_vert.png\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">imageBlocRose<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Image<\/span><span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_rose.png\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">imageBlocBleu<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Image<\/span><span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_bleu.png\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">imageBlocJaune<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Image<\/span><span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_jaune.png\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">imageBlocRouge<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Image<\/span><span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_rouge.png\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">imageBlocMetal<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Image<\/span><span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_metal.png\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">Bloc<\/span> <span class=\"nf\">getBlocVert<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Bloc<\/span><span class=\"p\">(<\/span><span class=\"n\">imageBlocVert<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">Bloc<\/span> <span class=\"nf\">getBlocRose<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Bloc<\/span><span class=\"p\">(<\/span><span class=\"n\">imageBlocRose<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">Bloc<\/span> <span class=\"nf\">getBlocBleu<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Bloc<\/span><span class=\"p\">(<\/span><span class=\"n\">imageBlocBleu<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">Bloc<\/span> <span class=\"nf\">getBlocJaune<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Bloc<\/span><span class=\"p\">(<\/span><span class=\"n\">imageBlocJaune<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">Bloc<\/span> <span class=\"nf\">getBlocRouge<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Bloc<\/span><span class=\"p\">(<\/span><span class=\"n\">imageBlocRouge<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">Bloc<\/span> <span class=\"nf\">getBlocMetal<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MetalBloc<\/span><span class=\"p\">(<\/span><span class=\"n\">imageBlocMetal<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Image<\/span> <span class=\"n\">imageBlocVert<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Image<\/span> <span class=\"n\">imageBlocRose<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Image<\/span> <span class=\"n\">imageBlocBleu<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Image<\/span> <span class=\"n\">imageBlocJaune<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Image<\/span> <span class=\"n\">imageBlocRouge<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Image<\/span> <span class=\"n\">imageBlocMetal<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">BLOC_FABRIQUE<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">image_bloc_vert<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_vert.png\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">image_bloc_rose<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_rose.png\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">image_bloc_bleu<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_bleu.png\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">image_bloc_jaune<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_jaune.png\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">image_bloc_rouge<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_rouge.png\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">image_bloc_metal<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"image_bloc_metal.png\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">bloc_vert<\/span><span class=\"p\">:<\/span><span class=\"nc\">BLOC<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"kc\">Result<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">image_bloc_vert<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">bloc_rose<\/span><span class=\"p\">:<\/span><span class=\"nc\">BLOC<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"kc\">Result<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">image_bloc_rose<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">bloc_bleu<\/span><span class=\"p\">:<\/span><span class=\"nc\">BLOC<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"kc\">Result<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">image_bloc_bleu<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">bloc_jaune<\/span><span class=\"p\">:<\/span><span class=\"nc\">BLOC<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"kc\">Result<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">image_bloc_jaune<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">bloc_rouge<\/span><span class=\"p\">:<\/span><span class=\"nc\">BLOC<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"kc\">Result<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">image_bloc_rouge<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">bloc_metal<\/span><span class=\"p\">:<\/span><span class=\"nc\">BLOC<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"kc\">Result<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">image_bloc_metal<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">image_bloc_vert<\/span><span class=\"p\">:<\/span><span class=\"nc\">IMAGE<\/span>\r\n\r\n\t<span class=\"n\">image_bloc_rose<\/span><span class=\"p\">:<\/span><span class=\"nc\">IMAGE<\/span>\r\n\r\n\t<span class=\"n\">image_bloc_bleu<\/span><span class=\"p\">:<\/span><span class=\"nc\">IMAGE<\/span>\r\n\r\n\t<span class=\"n\">image_bloc_jaune<\/span><span class=\"p\">:<\/span><span class=\"nc\">IMAGE<\/span>\r\n\r\n\t<span class=\"n\">image_bloc_rouge<\/span><span class=\"p\">:<\/span><span class=\"nc\">IMAGE<\/span>\r\n\r\n\t<span class=\"n\">image_bloc_metal<\/span><span class=\"p\">:<\/span><span class=\"nc\">IMAGE<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Ces exemples sont pris d&rsquo;un jeu Arkanoid. Dans ces exemples, on pr\u00e9sume qu&rsquo;une image est tr\u00e8s lourde en m\u00e9moire RAM, donc il est pr\u00e9f\u00e9rable de ne pas dupliquer ces images. Par contre, il est illogique de placer ces images ailleurs que dans une classe sp\u00e9cialis\u00e9e sur les \u00ab\u00a0Bloc\u00a0\u00bb. L&rsquo;id\u00e9al serait probablement que la classe \u00ab\u00a0Bloc\u00a0\u00bb elle-m\u00eame charge l&rsquo;image, mais se faisant, l&rsquo;image d&rsquo;un bloc d&rsquo;une certaine couleur sera dupliqu\u00e9e dans tous les blocs de cette couleur. En faisant une fabrique de blocs, on cr\u00e9e une classe sp\u00e9cialis\u00e9e dans la cr\u00e9ation de blocs et peut s&rsquo;occuper de ne pas dupliquer l&rsquo;image de chaque couleur de blocs.<\/p>\n<p>Dans l&rsquo;exemple d&rsquo;Eiffel pr\u00e9c\u00e9dent, on pourrait \u00e9galement s&rsquo;assurer que seule la classe {FABRIQUE_BLOC} peut cr\u00e9er un {BLOC} en rendant la classe {BLOC} ami avec {FABRIQUE_BLOC} (voir m\u00e9canique dans le singleton).<\/p>\n<h3>Fabrique abstraite<\/h3>\n<p>Lorsque le programme g\u00e8re plusieurs variantes diff\u00e9rentes des m\u00eames objets, on peut utiliser une <strong>fabrique abstraite<\/strong> (ou \u00ab\u00a0<strong>abstract factory<\/strong>\u00ab\u00a0) afin d&rsquo;\u00e9viter au programmeur d&rsquo;avoir \u00e0 se soucier du type d&rsquo;objet \u00e0 g\u00e9rer.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10289 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/fabrique_abstraite.png\" alt=\"\" width=\"977\" height=\"312\" \/><\/p>\n<h3>Monteur<\/h3>\n<p>Un <strong>monteur<\/strong> (ou \u00ab\u00a0<strong>builder<\/strong>\u00ab\u00a0) est une classe qui permet d&rsquo;assigner certains attributs d&rsquo;un objet avant de le cr\u00e9er. Souvent, un monteur est utilis\u00e9 lorsqu&rsquo;un objet doit \u00eatre initialis\u00e9 directement avec ses attributs pr\u00e9assign\u00e9s, mais qu&rsquo;en utilisant seulement des arguments du constructeur, ces derniers seraient trop complexes.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10158\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/monteur.png\" alt=\"\" width=\"533\" height=\"256\" \/><\/p>\n<h2>Les patrons structurels<\/h2>\n<h3>Adaptateur<\/h3>\n<p>Un <strong>adaptateur<\/strong> (ou \u00ab\u00a0<strong>Adapter<\/strong>\u00ab\u00a0) permet de faire fonctionner ensemble deux objets ayant des interfaces diff\u00e9rentes, mais permettant un travail similaire. Par exemple, nous allons d\u00e9velopper les classes suivantes:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10290 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/adaptateur.png\" alt=\"\" width=\"680\" height=\"337\" \/><\/p>\n<p>L&rsquo;objectif de la classe Adaptateur_Jouet, est de permettre \u00e0 un Jouet d&rsquo;\u00eatre utilis\u00e9 comme un Oiseau. Voici l&rsquo;impl\u00e9mentation de ces classes.<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Oiseau<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">crier<\/span><span class=\"p\">();<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Corneille<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Oiseau<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">crier<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Haar Haar\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Merle<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Oiseau<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">crier<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Pit Pit\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Jouet<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">ecraser<\/span><span class=\"p\">();<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">CanardDeBain<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Jouet<\/span> <span class=\"p\">{<\/span>\r\n    \r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">ecraser<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Squick Squick\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">AdaptateurJouet<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Oiseau<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Jouet<\/span> <span class=\"n\">jouet<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">AdaptateurJouet<\/span><span class=\"p\">(<\/span><span class=\"n\">Jouet<\/span> <span class=\"n\">aJouet<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">jouet<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aJouet<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">crier<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">jouet<\/span><span class=\"p\">.<\/span><span class=\"na\">ecraser<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Et voici un exemple d&rsquo;utilisation de l&rsquo;adaptateur:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.ArrayList<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Oiseau<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">oiseaux<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Oiseau<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">Jouet<\/span> <span class=\"n\">canard<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">CanardDeBain<\/span><span class=\"p\">();<\/span>\r\n\t\t<span class=\"n\">oiseaux<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Corneille<\/span><span class=\"p\">());<\/span>\r\n\t\t<span class=\"n\">oiseaux<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Merle<\/span><span class=\"p\">());<\/span>\r\n\t\t<span class=\"n\">oiseaux<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">AdaptateurJouet<\/span><span class=\"p\">(<\/span><span class=\"n\">canard<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"k\">for<\/span><span class=\"p\">(<\/span><span class=\"n\">Oiseau<\/span> <span class=\"n\">oiseau<\/span> <span class=\"p\">:<\/span> <span class=\"n\">oiseaux<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t<span class=\"n\">oiseau<\/span><span class=\"p\">.<\/span><span class=\"na\">crier<\/span><span class=\"p\">();<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">OISEAU<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">crier<\/span>\r\n\t\t<span class=\"kr\">deferred<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">CORNEILLE<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">OISEAU<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">crier<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Haar Haar\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">MERLE<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">OISEAU<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">crier<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Pit Pit\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">JOUET<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">ecraser<\/span>\r\n\t\t<span class=\"kr\">deferred<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">CANARD_DE_BAIN<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">JOUET<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">ecraser<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Squick Squick\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">ADAPTATEUR_JOUET<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">OISEAU<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">a_jouet<\/span><span class=\"p\">:<\/span><span class=\"nc\">JOUET<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">jouet<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_jouet<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">crier<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">jouet<\/span><span class=\"p\">.<\/span><span class=\"n\">ecraser<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Implementation<\/span>\r\n\r\n\t<span class=\"n\">jouet<\/span><span class=\"p\">:<\/span><span class=\"nc\">JOUET<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour utiliser l&rsquo;adaptateur:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Ex\u00e9cute l'application.<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">oiseaux<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">OISEAU<\/span><span class=\"o\">]<\/span>\r\n\t\t\t<span class=\"n\">canard<\/span><span class=\"p\">:<\/span><span class=\"nc\">CANARD_DE_BAIN<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARRAYED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">OISEAU<\/span><span class=\"o\">]<\/span><span class=\"p\">}<\/span> <span class=\"n\">oiseaux<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">canard<\/span>\r\n\t\t\t<span class=\"n\">oiseaux<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">CORNEILLE<\/span><span class=\"p\">})<\/span>\r\n\t\t\t<span class=\"n\">oiseaux<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">MERLE<\/span><span class=\"p\">})<\/span>\r\n\t\t\t<span class=\"n\">oiseaux<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ADAPTATEUR_JOUET<\/span><span class=\"p\">}.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">canard<\/span><span class=\"p\">))<\/span>\r\n\t\t\t<span class=\"kr\">across<\/span> <span class=\"n\">oiseaux<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_oiseaux<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t\t<span class=\"n\">la_oiseaux<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span><span class=\"p\">.<\/span><span class=\"n\">crier<\/span>\r\n\t\t\t\t<span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">put_new_line<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Lors de l&rsquo;ex\u00e9cution de ce code, on obtient le r\u00e9sultat suivant:<\/p>\n<pre>Haar Haar\r\nPit Pit\r\nSquick Squick<\/pre>\n<h3>D\u00e9corateur<\/h3>\n<p>Un <strong>d\u00e9corateur<\/strong> (ou \u00ab\u00a0<strong>decorator<\/strong>\u00ab\u00a0) permet d&rsquo;ajouter des fonctionnalit\u00e9s \u00e0 une classe, sans avoir \u00e0 modifier cette classe directement. Ce type de patron peut \u00eatre utile, par exemple, dans le cas o\u00f9 l&rsquo;on ne voulait pas avoir \u00e0 modifier tout le code d&rsquo;un programme \u00e0 cause d&rsquo;une modification d&rsquo;une classe. \u00c9galement, ce type de patron peut \u00eatre utile pour s&rsquo;assurer qu&rsquo;une classe n&rsquo;ait pas trop de responsabilit\u00e9s. Par exemple, voyez le diagramme suivant:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10216 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/Decorateur.png\" alt=\"\" width=\"578\" height=\"301\" \/><\/p>\n<p>L&rsquo;objectif de ce \u00ab\u00a0desing\u00a0\u00bb est d&rsquo;ajouter un menu \u00e0 une Page Web, sans n\u00e9cessairement avoir \u00e0 implanter ce menu dans la classe de la page Web (donc, en gardant cette derni\u00e8re simple).<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">PageWeb<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getTexte<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"Le texte de la page Web\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">DecorateurPage<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"kd\">private<\/span> <span class=\"n\">PageWeb<\/span> <span class=\"n\">page<\/span><span class=\"p\">;<\/span>\r\n\r\n\t<span class=\"kd\">public<\/span> <span class=\"nf\">DecorateurPage<\/span><span class=\"p\">(<\/span><span class=\"n\">PageWeb<\/span> <span class=\"n\">aPage<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">page<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aPage<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getTexte<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"k\">return<\/span> <span class=\"n\">page<\/span><span class=\"p\">.<\/span><span class=\"na\">getTexte<\/span><span class=\"p\">();<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">DecorateurPageMenu<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">DecorateurPage<\/span> <span class=\"p\">{<\/span>\r\n\t\r\n\t<span class=\"kd\">public<\/span> <span class=\"nf\">DecorateurPageMenu<\/span><span class=\"p\">(<\/span><span class=\"n\">PageWeb<\/span> <span class=\"n\">aPage<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"kd\">super<\/span><span class=\"p\">(<\/span><span class=\"n\">aPage<\/span><span class=\"p\">);<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getTexte<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">String<\/span> <span class=\"n\">textePage<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">getTexte<\/span><span class=\"p\">();<\/span>\r\n\t\t<span class=\"n\">String<\/span> <span class=\"n\">resultat<\/span><span class=\"p\">;<\/span>\r\n\t\t<span class=\"c1\">\/\/ Ajouter le menu dans le textePage et mettre le r\u00e9sultat dans resultat.<\/span>\r\n\t\t<span class=\"k\">return<\/span> <span class=\"n\">resultat<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">DecorateurPage<\/span> <span class=\"n\">page<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">DecorateurPageMenu<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">PageWeb<\/span><span class=\"p\">());<\/span>\r\n\t\t<span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">page<\/span><span class=\"p\">.<\/span><span class=\"na\">getTexte<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">PAGE_WEB<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Le texte de la page web.\"<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">DECORATEUR_PAGE<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">a_page<\/span><span class=\"p\">:<\/span><span class=\"nc\">PAGE_WEB<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">page<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_page<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">page<\/span><span class=\"p\">.<\/span><span class=\"n\">texte<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">page<\/span><span class=\"p\">:<\/span><span class=\"nc\">PAGE_WEB<\/span>\r\n\t\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">DECORATEUR_PAGE_MENU<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">DECORATEUR_PAGE<\/span>\r\n\t\t<span class=\"kr\">redefine<\/span>\r\n\t\t\t<span class=\"n\">texte<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\t<span class=\"c1\">-- Le constructeur de cette classe est le make de {DECORATEUR_PAGE}<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">l_texte_page<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">l_texte_page<\/span> <span class=\"o\">:=<\/span> <span class=\"kc\">Precursor<\/span>\r\n\t\t\t<span class=\"c1\">-- Ajouter le menu dans le texte l_texte_page et mettre le r\u00e9sultat dans Result<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Ex\u00e9cuter l'application.<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">l_page<\/span><span class=\"p\">:<\/span><span class=\"nc\">DECORATEUR_PAGE<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">DECORATEUR_PAGE_MENU<\/span><span class=\"p\">}<\/span> <span class=\"n\">l_page<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">PAGE_WEB<\/span><span class=\"p\">})<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">l_page<\/span><span class=\"p\">.<\/span><span class=\"n\">texte<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">put_new_line<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>Mod\u00e8le-Vue-Controlleur (MVC)<\/h3>\n<p>Le principe du patron MVC est de s\u00e9parer les classes en 3 parties: les classes du mod\u00e8le, les vues et les contr\u00f4leurs.<\/p>\n<h4>les classes du mod\u00e8le<\/h4>\n<p>Les classes du mod\u00e8le sont les classes directement reli\u00e9es au domaine d&rsquo;affaire que le programme permet une solution. Par exemple, si vous faites un programme pour un magasin, les classes du mod\u00e8le seront des classes comme: Produit, Vendeur, Caisse, etc. Si vous faites un programme pour une \u00e9cole, les classes du mod\u00e8le seront des classes comme: \u00c9tudiant, Enseignant, Classe, Bulletin, etc.<\/p>\n<h4>Les vues<\/h4>\n<p>Les vues sont toutes les classes qui g\u00e8rent l&rsquo;interface graphique. Les classes de vues sont les classes qui ont la responsabilit\u00e9 de g\u00e9rer des interfaces homme-machine comme: l&rsquo;affichage (fen\u00eatre, ligne de commande, etc.) ou les entr\u00e9es (clavier, souris, bouton, case de texte, etc.) L&rsquo;utilisateur manipule directement les classes de la vue.<\/p>\n<h4>Les contr\u00f4leurs<\/h4>\n<p>Les contr\u00f4leurs sont les classes contenant la logique applicative (les algorithmes de l&rsquo;application). Ils font le lien entre les classes du mod\u00e8le et les classes de la vue.<\/p>\n<h4>La s\u00e9paration<\/h4>\n<p>L&rsquo;important dans le patron MVC, c&rsquo;est la s\u00e9paration des diff\u00e9rents types de classes (mod\u00e8le, vue et contr\u00f4leur). Voici un diagramme d&rsquo;interd\u00e9pendance entre ces types:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10222 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/MVC_dependance.png\" alt=\"\" width=\"463\" height=\"303\" \/><\/p>\n<p>Dans ce diagramme, les fl\u00e8ches repr\u00e9sentent les d\u00e9pendances entre les types de classes. Il faut y lire que la vue d\u00e9pend du mod\u00e8le seulement; les contr\u00f4leurs d\u00e9pendent du mod\u00e8le et de la vue et le mod\u00e8le est compl\u00e8tement ind\u00e9pendant. Une autre fa\u00e7on de se le repr\u00e9senter, c&rsquo;est que la vue \u00ab\u00a0conna\u00eet\u00a0\u00bb le mod\u00e8le, mais pas le contr\u00f4leur; le contr\u00f4leur \u00ab\u00a0conna\u00eet\u00a0\u00bb le mod\u00e8le et la vue et le mod\u00e8le ne \u00ab\u00a0conna\u00eet\u00a0\u00bb rien d&rsquo;autre que lui-m\u00eame.<\/p>\n<p><a href=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/MVC.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10223\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/MVC.png\" alt=\"\" width=\"1751\" height=\"963\" \/><\/a><\/p>\n<h2>Patrons de comportement<\/h2>\n<h3>Chaine de responsabilit\u00e9<\/h3>\n<p>Une chaine de responsabilit\u00e9 permet de transmettre la responsabilit\u00e9 d&rsquo;une gestion vers un autre objet en suivant une chaine ou un arbre d&rsquo;objets interreli\u00e9s entre eux. Par exemple:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10227 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/chain_of_responsability.png\" alt=\"\" width=\"711\" height=\"412\" \/><\/p>\n<p>On voit qu&rsquo;il y a un principe parent\/enfant dans une vue. \u00c0 un endroit donn\u00e9 d&rsquo;une Vue, il peut y avoir plusieurs Vues diff\u00e9rentes (par exemple: une fen\u00eatre, une grille de Vues et un Bouton). Donc, lorsque la Fen\u00eatre re\u00e7oit une clique de souris, en plus de traiter lui-m\u00eame ce clique, il va lancer le clique de ses Vues enfants.<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.LinkedList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.ArrayList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.lang.IllegalArgumentException<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Vue<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Vue<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">enfants<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Vue<\/span> <span class=\"n\">parent<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Vue<\/span><span class=\"p\">(<\/span><span class=\"n\">Vue<\/span> <span class=\"n\">aParent<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">enfants<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Vue<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">parent<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aParent<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">parent<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">parent<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Vue<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">getEnfants<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Vue<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">enfants<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"n\">Vue<\/span> <span class=\"n\">aEnfant<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aEnfant<\/span><span class=\"p\">.<\/span><span class=\"na\">parent<\/span> <span class=\"o\">==<\/span> <span class=\"k\">this<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">enfants<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">aEnfant<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IllegalArgumentException<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">CliquableVue<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Vue<\/span><span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">CliquableVue<\/span><span class=\"p\">(<\/span><span class=\"n\">Vue<\/span> <span class=\"n\">aParent<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n       <span class=\"kd\">super<\/span><span class=\"p\">(<\/span><span class=\"n\">aParent<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">gestionClique<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aX<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aY<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">CliquableVue<\/span> <span class=\"n\">cliquableEnfant<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">for<\/span><span class=\"p\">(<\/span><span class=\"n\">Vue<\/span> <span class=\"n\">enfant<\/span> <span class=\"p\">:<\/span> <span class=\"n\">getEnfants<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">enfant<\/span> <span class=\"k\">instanceof<\/span> <span class=\"n\">CliquableVue<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">cliquableEnfant<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">CliquableVue<\/span><span class=\"p\">)<\/span> <span class=\"n\">enfant<\/span><span class=\"p\">;<\/span>\r\n                <span class=\"n\">cliquableEnfant<\/span><span class=\"p\">.<\/span><span class=\"na\">gestionClique<\/span><span class=\"p\">(<\/span><span class=\"n\">aX<\/span><span class=\"p\">,<\/span> <span class=\"n\">aY<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"p\">}<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Grille<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">CliquableVue<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Grille<\/span><span class=\"p\">(<\/span><span class=\"n\">Vue<\/span> <span class=\"n\">aParent<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">(<\/span><span class=\"n\">aParent<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">gestionClique<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aX<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aY<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">gestionClique<\/span><span class=\"p\">(<\/span><span class=\"n\">aX<\/span><span class=\"p\">,<\/span> <span class=\"n\">aY<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"c1\">\/\/ Gestion particuli\u00e8re du clique de souris pour la grille<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Fenetre<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">CliquableVue<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Fenetre<\/span><span class=\"p\">(<\/span><span class=\"n\">Vue<\/span> <span class=\"n\">aParent<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">(<\/span><span class=\"n\">aParent<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">gestionClique<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aX<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aY<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">gestionClique<\/span><span class=\"p\">(<\/span><span class=\"n\">aX<\/span><span class=\"p\">,<\/span> <span class=\"n\">aY<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"c1\">\/\/ Gestion particuli\u00e8re du clique de souris pour la Fenetre<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Bouton<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">CliquableVue<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Bouton<\/span><span class=\"p\">(<\/span><span class=\"n\">Vue<\/span> <span class=\"n\">aParent<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">(<\/span><span class=\"n\">aParent<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">gestionClique<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aX<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aY<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">gestionClique<\/span><span class=\"p\">(<\/span><span class=\"n\">aX<\/span><span class=\"p\">,<\/span> <span class=\"n\">aY<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"c1\">\/\/ Gestion particuli\u00e8re du clique de souris pour le bouton.<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Fenetre<\/span> <span class=\"n\">fenetre<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Fenetre<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">Grille<\/span> <span class=\"n\">grille<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Grille<\/span><span class=\"p\">(<\/span><span class=\"n\">fenetre<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">Bouton<\/span> <span class=\"n\">bouton1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Bouton<\/span><span class=\"p\">(<\/span><span class=\"n\">grille<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">Bouton<\/span> <span class=\"n\">bouton2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Bouton<\/span><span class=\"p\">(<\/span><span class=\"n\">grille<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">fenetre<\/span><span class=\"p\">.<\/span><span class=\"na\">gestionClique<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">VUE<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initilisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">aParent<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">VUE<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">LINKED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">VUE<\/span><span class=\"o\">]<\/span><span class=\"p\">}<\/span> <span class=\"n\">internal_enfants<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"n\">parent<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">aParent<\/span>\r\n\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">parent<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">laParent<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t<span class=\"n\">laParent<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_enfant<\/span><span class=\"p\">(<\/span><span class=\"kc\">Current<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">parent<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">VUE<\/span>\r\n\r\n\t<span class=\"n\">enfants<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">VUE<\/span><span class=\"o\">]<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">internal_enfants<\/span><span class=\"p\">.<\/span><span class=\"n\">twin<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"nc\">VUE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">ajouter_enfant<\/span><span class=\"p\">(<\/span><span class=\"n\">a_enfant<\/span><span class=\"p\">:<\/span><span class=\"nc\">VUE<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">require<\/span>\r\n\t\t\t<span class=\"n\">Is_Parent<\/span><span class=\"p\">:<\/span> <span class=\"n\">a_enfant<\/span><span class=\"p\">.<\/span><span class=\"n\">parent<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">Current<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">internal_enfants<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span><span class=\"p\">(<\/span><span class=\"n\">a_enfant<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">internal_enfants<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">VUE<\/span><span class=\"o\">]<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">CLIQUABLE_VUE<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">VUE<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">gestion_clique<\/span><span class=\"p\">(<\/span><span class=\"n\">a_x<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_y<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">across<\/span> <span class=\"n\">enfants<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_enfants<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"p\">{<\/span><span class=\"nc\">CLIQUABLE_VUE<\/span><span class=\"p\">}<\/span> <span class=\"n\">la_enfants<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_enfant<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t\t<span class=\"n\">la_enfant<\/span><span class=\"p\">.<\/span><span class=\"n\">gestion_clique<\/span><span class=\"p\">(<\/span><span class=\"n\">a_x<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_y<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">FENETRE<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">CLIQUABLE_VUE<\/span>\r\n\t\t<span class=\"kr\">redefine<\/span>\r\n\t\t\t<span class=\"n\">gestion_clique<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">gestion_clique<\/span><span class=\"p\">(<\/span><span class=\"n\">a_x<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_y<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Precursor<\/span><span class=\"p\">(<\/span><span class=\"n\">a_x<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_y<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Gestion particuli\u00e8re du clique de souris pour la fen\u00eatre.<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">GRILLE<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">CLIQUABLE_VUE<\/span>\r\n\t\t<span class=\"kr\">redefine<\/span>\r\n\t\t\t<span class=\"n\">gestion_clique<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">gestion_clique<\/span><span class=\"p\">(<\/span><span class=\"n\">a_x<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_y<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Precursor<\/span><span class=\"p\">(<\/span><span class=\"n\">a_x<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_y<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Gestion particuli\u00e8re du clique de souris pour le bouton.<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">BOUTON<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">CLIQUABLE_VUE<\/span>\r\n\t\t<span class=\"kr\">redefine<\/span>\r\n\t\t\t<span class=\"n\">gestion_clique<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">gestion_clique<\/span><span class=\"p\">(<\/span><span class=\"n\">a_x<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_y<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Precursor<\/span><span class=\"p\">(<\/span><span class=\"n\">a_x<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_y<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Gestion particuli\u00e8re du clique de souris pour le bouton.<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Ex\u00e9cuter l'application.<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">fenetre<\/span><span class=\"p\">:<\/span><span class=\"nc\">FENETRE<\/span>\r\n\t\t\t<span class=\"n\">grille<\/span><span class=\"p\">:<\/span><span class=\"nc\">GRILLE<\/span>\r\n\t\t\t<span class=\"n\">bouton1<\/span><span class=\"p\">,<\/span> <span class=\"n\">bouton2<\/span><span class=\"p\">:<\/span><span class=\"nc\">BOUTON<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">fenetre<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"kc\">Void<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">grille<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"n\">fenetre<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">bouton1<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"n\">grille<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">bouton2<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"n\">grille<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">fenetre<\/span><span class=\"p\">.<\/span><span class=\"n\">gestion_clique<\/span> <span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>It\u00e9rateur<\/h3>\n<p>Un it\u00e9rateur permet d&rsquo;it\u00e9rer sur une structure de donn\u00e9e sans avoir besoin de se soucier le la m\u00e9canique interne de la structure.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10229\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/iterateur.png\" alt=\"\" width=\"626\" height=\"386\" \/><\/p>\n<h3>M\u00e9diateur<\/h3>\n<p>Un <strong>m\u00e9diateur<\/strong> (ou \u00ab\u00a0<strong>mediator<\/strong>\u00ab\u00a0) permet de transf\u00e9rer les messages entre diff\u00e9rentes classes. Ce type de classe permet de diminuer l&rsquo;interd\u00e9pendance entre les diff\u00e9rentes classes. En effet, en g\u00e9n\u00e9ral, on essaie de diminuer l&rsquo;interd\u00e9pendance des classes (souvent appel\u00e9 le principe du faible couplage), afin d&rsquo;optimiser la r\u00e9utilisabilit\u00e9.<\/p>\n<p>Si dans mon projet, j&rsquo;ai par exemple une fen\u00eatre et un produit. Dans la fen\u00eatre, il y a un champ texte permettant de modifier le nom du produit et un bouton OK permettant d&rsquo;accepter la modification du nom du produit. De son c\u00f4t\u00e9, le produit a une m\u00e9thode \u00ab\u00a0change_nom\u00a0\u00bb permettant de modifier le nom du produit qui v\u00e9rifie que le nom est valide. Si le nom n&rsquo;est pas valide, le produit doit en informer la fen\u00eatre afin que cette derni\u00e8re affiche un message d&rsquo;erreur pour l&rsquo;utilisateur.<\/p>\n<p>On pourrait repr\u00e9senter cet exemple avec le diagramme de classe suivant:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10231 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/mediateur_mauvais.png\" alt=\"\" width=\"532\" height=\"120\" \/><\/p>\n<p>Par contre, ici, la fen\u00eatre et le produit deviennent d\u00e9pendants un de l&rsquo;autre puisque la fen\u00eatre n\u00e9cessite le produit pour lancer sa m\u00e9thode \u00ab\u00a0changer_nom\u00a0\u00bb et le produit n\u00e9cessite la fen\u00eatre pour lancer la m\u00e9thode \u00ab\u00a0erreur_nom\u00a0\u00bb.<\/p>\n<p>En utilisant un m\u00e9diateur, on peut s&rsquo;assurer de garder l&rsquo;interd\u00e9pendance entre les deux classes. Voici un exemple: <img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10232\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/mediateur_correct.png\" alt=\"\" width=\"1043\" height=\"348\" \/><\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Fenetre<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Fenetre<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">texte<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">texte<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setTexte<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aTexte<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">texte<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aTexte<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getTexte<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">texte<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">boutonClique<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">mediateur<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">mediateur<\/span><span class=\"p\">.<\/span><span class=\"na\">changeTexte<\/span><span class=\"p\">(<\/span><span class=\"n\">texte<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setMediateur<\/span><span class=\"p\">(<\/span><span class=\"n\">MediateurFenetre<\/span> <span class=\"n\">aMediateur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">mediateur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aMediateur<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">erreurTexte<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le texte n'est pas valide.\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">MediateurFenetre<\/span> <span class=\"n\">mediateur<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Produit<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Produit<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">changeNom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aNom<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">||<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">.<\/span><span class=\"na\">isEmpty<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">mediateur<\/span><span class=\"p\">.<\/span><span class=\"na\">erreurNom<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setMediateur<\/span><span class=\"p\">(<\/span><span class=\"n\">MediateurProduit<\/span> <span class=\"n\">aMediateur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">mediateur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aMediateur<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"n\">MediateurProduit<\/span> <span class=\"n\">mediateur<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">MediateurFenetre<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">changeTexte<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aTexte<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">MediateurProduit<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">erreurNom<\/span><span class=\"p\">();<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MediateurFenetreProduit<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">MediateurFenetre<\/span><span class=\"p\">,<\/span> <span class=\"n\">MediateurProduit<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">MediateurFenetreProduit<\/span><span class=\"p\">(<\/span><span class=\"n\">Fenetre<\/span> <span class=\"n\">aFenetre<\/span><span class=\"p\">,<\/span> <span class=\"n\">Produit<\/span> <span class=\"n\">aProduit<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">fenetre<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aFenetre<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">produit<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aProduit<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">fenetre<\/span><span class=\"p\">.<\/span><span class=\"na\">setMediateur<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"na\">setMediateur<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Fenetre<\/span> <span class=\"n\">fenetre<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Produit<\/span> <span class=\"n\">produit<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">erreurNom<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">fenetre<\/span><span class=\"p\">.<\/span><span class=\"na\">erreurTexte<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">changeTexte<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aTexte<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"na\">changeNom<\/span><span class=\"p\">(<\/span><span class=\"n\">aTexte<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">FENETRE<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">texte<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"\"<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_texte<\/span>\r\n\r\n\t<span class=\"n\">set_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">texte<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_texte<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">bouton_clique<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">mediateur<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_mediateur<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t<span class=\"n\">la_mediateur<\/span><span class=\"p\">.<\/span><span class=\"n\">change_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">texte<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">erreur_texte<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le texte n'est pas valide.%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">mediateur<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">MEDIATEUR_FENETRE<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_mediateur<\/span>\r\n\r\n\t<span class=\"n\">set_mediateur<\/span><span class=\"p\">(<\/span><span class=\"n\">a_mediateur<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">MEDIATEUR_FENETRE<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">mediateur<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_mediateur<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">PRODUIT<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"\"<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">nom<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\r\n\t<span class=\"n\">change_nom<\/span><span class=\"p\">(<\/span><span class=\"n\">a_nom<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">mediateur<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_mediateur<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t<span class=\"n\">la_mediateur<\/span><span class=\"p\">.<\/span><span class=\"n\">erreur_nom<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">mediateur<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">MEDIATEUR_PRODUIT<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_mediateur<\/span>\r\n\r\n\t<span class=\"n\">set_mediateur<\/span><span class=\"p\">(<\/span><span class=\"n\">a_mediateur<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">MEDIATEUR_PRODUIT<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">mediateur<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_mediateur<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">MEDIATEUR_FENETRE<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">change_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">deferred<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">MEDIATEUR_PRODUIT<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">erreur_nom<\/span>\r\n\t\t<span class=\"kr\">deferred<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t\t\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">MEDIATEUR_FENETRE_PRODUIT<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">MEDIATEUR_FENETRE<\/span>\r\n\t<span class=\"nc\">MEDIATEUR_PRODUIT<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">a_fenetre<\/span><span class=\"p\">:<\/span><span class=\"nc\">FENETRE<\/span><span class=\"p\">;<\/span> <span class=\"n\">a_produit<\/span><span class=\"p\">:<\/span><span class=\"nc\">PRODUIT<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">fenetre<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_fenetre<\/span>\r\n\t\t\t<span class=\"n\">produit<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_produit<\/span>\r\n\t\t\t<span class=\"n\">fenetre<\/span><span class=\"p\">.<\/span><span class=\"n\">set_mediateur<\/span> <span class=\"p\">(<\/span><span class=\"kc\">Current<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"n\">set_mediateur<\/span> <span class=\"p\">(<\/span><span class=\"kc\">Current<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">fenetre<\/span><span class=\"p\">:<\/span><span class=\"nc\">FENETRE<\/span>\r\n\r\n\t<span class=\"n\">produit<\/span><span class=\"p\">:<\/span><span class=\"nc\">PRODUIT<\/span>\r\n\r\n\t<span class=\"n\">change_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"n\">change_nom<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">erreur_nom<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">fenetre<\/span><span class=\"p\">.<\/span><span class=\"n\">erreur_texte<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Ex\u00e9cute l'application.<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">produit<\/span><span class=\"p\">:<\/span><span class=\"nc\">PRODUIT<\/span>\r\n\t\t\t<span class=\"n\">fenetre<\/span><span class=\"p\">:<\/span><span class=\"nc\">FENETRE<\/span>\r\n\t\t\t<span class=\"n\">mediateur<\/span><span class=\"p\">:<\/span><span class=\"nc\">MEDIATEUR_FENETRE_PRODUIT<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">fenetre<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">mediateur<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"n\">fenetre<\/span><span class=\"p\">,<\/span> <span class=\"n\">produit<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">fenetre<\/span><span class=\"p\">.<\/span><span class=\"n\">bouton_clique<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit que dans ce cas, nous pourrions facilement mettre les classes \u00ab\u00a0Fenetre\u00a0\u00bb et \u00ab\u00a0MediateurFenetre\u00a0\u00bb dans un \u00ab\u00a0package\u00a0\u00bb, \u00ab\u00a0d\u00e9p\u00f4t\u00a0\u00bb, \u00ab\u00a0librairie\u00a0\u00bb, etc. et faire de m\u00eame avec \u00ab\u00a0Produit\u00a0\u00bb et \u00ab\u00a0MediateurProduit\u00a0\u00bb. Ils sont donc rendus ind\u00e9pendants. Lorsque l&rsquo;utilisateur veut utiliser la classe \u00ab\u00a0Produit\u00a0\u00bb ou \u00ab\u00a0Fenetre\u00a0\u00bb, il doit se cr\u00e9er une classe m\u00e9diatrice qui h\u00e9rite (impl\u00e9mente dans le cas de java) du m\u00e9diateur respectif (\u00ab\u00a0MediateurProduit\u00a0\u00bb ou \u00ab\u00a0MediateurFenetre\u00a0\u00bb).<\/p>\n<h3>M\u00e9mento<\/h3>\n<p>Un <strong>m\u00e9mento<\/strong> (ou \u00ab\u00a0<strong>memento<\/strong>\u00ab\u00a0) permet de garder l&rsquo;\u00e9tat d&rsquo;un objet pour pouvoir retourner \u00e0 cet \u00e9tat dans le futur. Ce type de m\u00e9canique est g\u00e9n\u00e9ralement utile lorsque le logiciel n\u00e9cessite la fonctionnalit\u00e9 de \u00ab\u00a0d\u00e9faire\u00a0\u00bb et de \u00ab\u00a0refaire\u00a0\u00bb (\u00ab\u00a0undo\u00a0\u00bb et \u00ab\u00a0redo\u00a0\u00bb).<\/p>\n<p>Le principe du M\u00e9mento est le suivant:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-675 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2022\/09\/memento-2.png\" alt=\"\" width=\"482\" height=\"286\" \/><\/p>\n<p>L&rsquo;objet \u00e0 sauvegarder contient des attributs repr\u00e9sentants l&rsquo;\u00e9tat de l&rsquo;objet \u00e0 un instant donn\u00e9 (par exemple, ici, c&rsquo;est le texte et le curseur). Ensuite, on permet de cr\u00e9er des objets M\u00e9mento contenant une copie de l&rsquo;\u00e9tat \u00e0 partir de l&rsquo;objet qu&rsquo;on veut permettre de d\u00e9faire et refaire les modifications (ici, la boite texte). Un autre objet Gardien permet de sauvegarder et de retourner les diff\u00e9rents M\u00e9mentos. Finalement, l&rsquo;objet qu&rsquo;on veut permettre de d\u00e9faire et refaire les modifications doit \u00e9galement avoir une m\u00e9thode pour remettre son \u00e9tat \u00e0 l&rsquo;\u00e9tat d&rsquo;un m\u00e9mento.<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">BoiteTexte<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">texte<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">curseur<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">BoiteTexte<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">setTexte<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">setCurseur<\/span><span class=\"o\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setTexte<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aTexte<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">texte<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aTexte<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getTexte<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">texte<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setCurseur<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aCurseur<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">curseur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aCurseur<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getCurseur<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">curseur<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">TexteMemento<\/span> <span class=\"nf\">creerMemento<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">TexteMemento<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">String<\/span><span class=\"o\">(<\/span><span class=\"n\">texte<\/span><span class=\"o\">),<\/span> <span class=\"n\">curseur<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setMemento<\/span><span class=\"o\">(<\/span><span class=\"n\">TexteMemento<\/span> <span class=\"n\">aMemento<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">setTexte<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">String<\/span><span class=\"o\">(<\/span><span class=\"n\">aMemento<\/span><span class=\"o\">.<\/span><span class=\"na\">getTexte<\/span><span class=\"o\">()));<\/span>\r\n        <span class=\"n\">setCurseur<\/span><span class=\"o\">(<\/span><span class=\"n\">aMemento<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurseur<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">TexteMemento<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">texte<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">curseur<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getTexte<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">texte<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getCurseur<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">curseur<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">TexteMemento<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aTexte<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aCurseur<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">texte<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aTexte<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"n\">curseur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aCurseur<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.LinkedList<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Gardien<\/span> <span class=\"p\">{<\/span>\r\n    \r\n    <span class=\"kd\">private<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TexteMemento<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">etats<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TexteMemento<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">getEtats<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">etats<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">index<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getIndex<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">index<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Gardien<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">etats<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TexteMemento<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">index<\/span> <span class=\"o\">=<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">ajouterMemento<\/span><span class=\"p\">(<\/span><span class=\"n\">TexteMemento<\/span> <span class=\"n\">aMemento<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">index<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">()<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">){<\/span>\r\n            <span class=\"n\">etats<\/span> <span class=\"o\">=<\/span> <span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"na\">subList<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">aMemento<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">index<\/span> <span class=\"o\">=<\/span> <span class=\"n\">index<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">TexteMemento<\/span> <span class=\"nf\">getMemento<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">TexteMemento<\/span> <span class=\"n\">lMemento<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">index<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">()<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">index<\/span> <span class=\"o\">&gt;<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lMemento<\/span> <span class=\"o\">=<\/span> <span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">index<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IndexOutOfBoundsException<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Index invalid\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">index<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">precedent<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">index<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">index<\/span> <span class=\"o\">=<\/span> <span class=\"n\">index<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IndexOutOfBoundsException<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Index invalid\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">suivant<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">index<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">index<\/span> <span class=\"o\">=<\/span> <span class=\"n\">index<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IndexOutOfBoundsException<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Index invalid\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">BoiteTexte<\/span> <span class=\"n\">boiteTexte<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BoiteTexte<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">Gardien<\/span> <span class=\"n\">gardien<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Gardien<\/span><span class=\"p\">();<\/span>\r\n\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setTexte<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\u00c9tat 1\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setCurseur<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">gardien<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterMemento<\/span><span class=\"p\">(<\/span><span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">creerMemento<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setTexte<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\u00c9tat 2\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setCurseur<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">gardien<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterMemento<\/span><span class=\"p\">(<\/span><span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">creerMemento<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setTexte<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\u00c9tat 3\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setCurseur<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">gardien<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterMemento<\/span><span class=\"p\">(<\/span><span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">creerMemento<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"n\">gardien<\/span><span class=\"p\">.<\/span><span class=\"na\">precedent<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setTexte<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\u00c9tat 4\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setCurseur<\/span><span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">gardien<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterMemento<\/span><span class=\"p\">(<\/span><span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">creerMemento<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setTexte<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\u00c9tat 5\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setCurseur<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">gardien<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterMemento<\/span><span class=\"p\">(<\/span><span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">creerMemento<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"n\">gardien<\/span><span class=\"p\">.<\/span><span class=\"na\">precedent<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">setMemento<\/span><span class=\"p\">(<\/span><span class=\"n\">gardien<\/span><span class=\"p\">.<\/span><span class=\"na\">getMemento<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Texte: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">getTexte<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span>\r\n                <span class=\"s\">\" Curseur: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">boiteTexte<\/span><span class=\"p\">.<\/span><span class=\"na\">getCurseur<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">BOITE_TEXTE<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">--Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">texte<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"\"<\/span>\r\n\t\t\t<span class=\"n\">curseur<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">0<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">creer_memento<\/span><span class=\"p\">:<\/span><span class=\"nc\">TEXTE_MEMENTO<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"kc\">Result<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">texte<\/span><span class=\"p\">.<\/span><span class=\"n\">twin<\/span><span class=\"p\">,<\/span> <span class=\"n\">curseur<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">set_memento<\/span><span class=\"p\">(<\/span><span class=\"n\">a_memento<\/span><span class=\"p\">:<\/span><span class=\"nc\">TEXTE_MEMENTO<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">set_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_memento<\/span><span class=\"p\">.<\/span><span class=\"n\">texte<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">set_curseur<\/span><span class=\"p\">(<\/span><span class=\"n\">a_memento<\/span><span class=\"p\">.<\/span><span class=\"n\">curseur<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_texte<\/span>\r\n\r\n\t<span class=\"n\">set_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">texte<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_texte<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">curseur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_curseur<\/span>\r\n\r\n\t<span class=\"n\">set_curseur<\/span><span class=\"p\">(<\/span><span class=\"n\">a_curseur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">curseur<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_curseur<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">TEXTE_MEMENTO<\/span>\r\n\r\n<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">BOITE_TEXTE<\/span><span class=\"p\">}<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">--Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">;<\/span> <span class=\"n\">a_curseur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">texte<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_texte<\/span>\r\n\t\t\t<span class=\"n\">curseur<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_curseur<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"nc\">BOITE_TEXTE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Implementation<\/span>\r\n\r\n\t<span class=\"n\">texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\r\n\t<span class=\"n\">curseur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kr\">class<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"nc\">GARDIEN<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"kr\">create<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"n\">make<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"kr\">feature<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"c1\">-- Initialisation<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"w\">\t<\/span><span class=\"n\">make<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">do<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"kr\">create<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"nc\">LINKED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">TEXTE_MEMENTO<\/span><span class=\"o\">]<\/span><span class=\"p\">}<\/span><span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"mi\">0<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"kr\">feature<\/span><span class=\"w\"> <\/span><span class=\"c1\">-- Acc\u00e8s<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"w\">\t<\/span><span class=\"n\">etats<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">TEXTE_MEMENTO<\/span><span class=\"o\">]<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"w\">\t<\/span><span class=\"n\">index<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"w\">\t<\/span><span class=\"n\">ajouter_memento<\/span><span class=\"p\">(<\/span><span class=\"n\">a_memento<\/span><span class=\"p\">:<\/span><span class=\"nc\">TEXTE_MEMENTO<\/span><span class=\"p\">)<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">do<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"kr\">from<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"kr\">until<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t\t<\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">&gt;=<\/span><span class=\"w\"> <\/span><span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"n\">count<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"kr\">loop<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t\t<\/span><span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"n\">finish<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t\t<\/span><span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"n\">remove<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">a_memento<\/span><span class=\"p\">)<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"mi\">1<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"w\">\t<\/span><span class=\"n\">memento<\/span><span class=\"p\">:<\/span><span class=\"nc\">TEXTE_MEMENTO<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">require<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">Index_Valid<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">&gt;=<\/span><span class=\"w\"> <\/span><span class=\"mi\">1<\/span><span class=\"w\"> <\/span><span class=\"ow\">and<\/span><span class=\"w\"> <\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;=<\/span><span class=\"w\"> <\/span><span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"n\">count<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">do<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"kc\">Result<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"n\">at<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">index<\/span><span class=\"p\">)<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"w\">\t<\/span><span class=\"n\">precedent<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">require<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">Index_Valid<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"mi\">1<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">do<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">-<\/span><span class=\"w\"> <\/span><span class=\"mi\">1<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"w\">\t<\/span><span class=\"n\">suivant<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">require<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">Index_Valid<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;<\/span><span class=\"w\"> <\/span><span class=\"n\">etats<\/span><span class=\"p\">.<\/span><span class=\"n\">count<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">do<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"n\">index<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"mi\">1<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialization<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">BOITE_TEXTE<\/span>\r\n\t\t\t<span class=\"n\">l_gardien<\/span><span class=\"p\">:<\/span><span class=\"nc\">GARDIEN<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_gardien<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_texte<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Etat 1\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_curseur<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_gardien<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_memento<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_memento<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_texte<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Etat 2\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_curseur<\/span> <span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_gardien<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_memento<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_memento<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_texte<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Etat 3\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_curseur<\/span> <span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_gardien<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_memento<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_memento<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_gardien<\/span><span class=\"p\">.<\/span><span class=\"n\">precedent<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_texte<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Etat 4\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_curseur<\/span> <span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_gardien<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_memento<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_memento<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_texte<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Etat 5\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_curseur<\/span> <span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_gardien<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_memento<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_memento<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_gardien<\/span><span class=\"p\">.<\/span><span class=\"n\">precedent<\/span>\r\n\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">set_memento<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_gardien<\/span><span class=\"p\">.<\/span><span class=\"n\">memento<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Texte: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">texte<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" Curseur: \"<\/span> <span class=\"o\">+<\/span>\r\n\t\t\t\t\t<span class=\"n\">l_boite_texte<\/span><span class=\"p\">.<\/span><span class=\"n\">curseur<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans les exemples pr\u00e9c\u00e9dents, le r\u00e9sultat est:<\/p>\n<pre>Texte: \u00c9tat 4 Curseur: 4<\/pre>\n<h3>Observeur<\/h3>\n<p>Le patron <strong>observeur<\/strong> (ou \u00ab\u00a0<strong>observer<\/strong>\u00ab\u00a0) permet \u00e0 plusieurs objets de type \u00ab\u00a0observeur\u00a0\u00bb d&rsquo;observer un objet de type \u00ab\u00a0<strong>observable<\/strong>\u00ab\u00a0. D\u00e8s que l&rsquo;\u00e9tat de l&rsquo;objet observable change, les objets de type \u00ab\u00a0observeur\u00a0\u00bb en sont imm\u00e9diatement inform\u00e9s. De plus, il n&rsquo;est pas n\u00e9cessaire que les objets de type \u00ab\u00a0observable\u00a0\u00bb aient de d\u00e9pendance envers les objets de type \u00ab\u00a0observeur\u00a0\u00bb. En d&rsquo;autre mots, l&rsquo;objet de type \u00ab\u00a0observable\u00a0\u00bb n&rsquo;a pas \u00e0 \u00ab\u00a0connaitre\u00a0\u00bb les \u00ab\u00a0observeur\u00a0\u00bb pour que le patron fonctionne. Par exemple:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10238\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/observeur.png\" alt=\"\" width=\"778\" height=\"388\" \/><\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.LinkedList<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Observable<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Observeur<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">observeurs<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Observable<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">observeurs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Observeur<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">attache<\/span><span class=\"p\">(<\/span><span class=\"n\">Observeur<\/span> <span class=\"n\">aObserveur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">observeurs<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">aObserveur<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">detache<\/span><span class=\"p\">(<\/span><span class=\"n\">Observeur<\/span> <span class=\"n\">aObserveur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">observeurs<\/span><span class=\"p\">.<\/span><span class=\"na\">remove<\/span><span class=\"p\">(<\/span><span class=\"n\">aObserveur<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">informe<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">for<\/span><span class=\"p\">(<\/span><span class=\"n\">Observeur<\/span> <span class=\"n\">laObserveur<\/span> <span class=\"p\">:<\/span> <span class=\"n\">observeurs<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">laObserveur<\/span><span class=\"p\">.<\/span><span class=\"na\">actualisation<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">Observeur<\/span> <span class=\"p\">{<\/span>\r\n    \r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">actualisation<\/span><span class=\"p\">(<\/span><span class=\"n\">Observable<\/span> <span class=\"n\">observable<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Produit<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Observable<\/span> <span class=\"p\">{<\/span>\r\n\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Produit<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n\t\t<span class=\"n\">informe<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">prix<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getPrix<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prix<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setPrix<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aPrix<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">prix<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aPrix<\/span><span class=\"p\">;<\/span>\r\n\t\t<span class=\"n\">informe<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">AfficheurProduit<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Observeur<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">AfficheurProduit<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">texte<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">texte<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getTexte<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">texte<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">actualisation<\/span><span class=\"p\">(<\/span><span class=\"n\">Observable<\/span> <span class=\"n\">aObservable<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Produit<\/span> <span class=\"n\">lProduit<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">Produit<\/span><span class=\"p\">)<\/span><span class=\"n\">aObservable<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">texte<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Le produit \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lProduit<\/span><span class=\"p\">.<\/span><span class=\"na\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" au cout de \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lProduit<\/span><span class=\"p\">.<\/span><span class=\"na\">getPrix<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">AfficheurProduit<\/span> <span class=\"n\">afficheur<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">AfficheurProduit<\/span><span class=\"p\">();<\/span>\r\n\t\t<span class=\"n\">Produit<\/span> <span class=\"n\">produit<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Produit<\/span><span class=\"p\">();<\/span>\r\n\t\t<span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"na\">attache<\/span><span class=\"p\">(<\/span><span class=\"n\">afficheur<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"na\">setNom<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Ordinateur\"<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"na\">setPrix<\/span><span class=\"p\">(<\/span><span class=\"mi\">200<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">afficheur<\/span><span class=\"p\">.<\/span><span class=\"na\">getTexte<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est important de noter que la m\u00e9canique Observeur est d\u00e9j\u00e0 dans les librairies Java. Par contre, consid\u00e9rant que Java ne g\u00e8re pas l&rsquo;h\u00e9ritage multiple, il est parfois n\u00e9cessaire de coder la m\u00e9canique de l&rsquo;observable \u00e0 dans la classe qui doit \u00eatre observable. Voir: <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/Observer.html\">https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/Observer.html<\/a><\/p>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">OBSERVABLE<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">LINKED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">OBSERVEUR<\/span><span class=\"o\">]<\/span><span class=\"p\">}<\/span> <span class=\"n\">observeurs<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">attache<\/span><span class=\"p\">(<\/span><span class=\"n\">a_observeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">OBSERVEUR<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">observeurs<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_observeur<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">detache<\/span><span class=\"p\">(<\/span><span class=\"n\">a_observeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">OBSERVEUR<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">observeurs<\/span><span class=\"p\">.<\/span><span class=\"n\">prune_all<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_observeur<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">informe<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">observeurs<\/span><span class=\"p\">.<\/span><span class=\"n\">do_all<\/span> <span class=\"p\">(<\/span>\r\n\t\t\t\t<span class=\"kr\">agent<\/span> <span class=\"p\">{<\/span><span class=\"nc\">OBSERVEUR<\/span><span class=\"p\">}.<\/span><span class=\"n\">actualisation<\/span><span class=\"p\">(<\/span><span class=\"kc\">Current<\/span><span class=\"p\">))<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentaition<\/span>\r\n\r\n\t<span class=\"n\">observeurs<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">OBSERVEUR<\/span><span class=\"o\">]<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">OBSERVEUR<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"nc\">OBSERVABLE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">actualisation<\/span><span class=\"p\">(<\/span><span class=\"n\">a_observable<\/span><span class=\"p\">:<\/span><span class=\"nc\">OBSERVABLE<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">deferred<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Gr\u00e2ce \u00e0 la m\u00e9canique de classe ami d&rsquo;Eiffel. On voit qu&rsquo;on peut retreindre les appels de la m\u00e9thode \u00ab\u00a0actualisation\u00a0\u00bb aux classes \u00ab\u00a0OBSERVABLE\u00a0\u00bb seulement. Cel\u00e0 permet d&rsquo;\u00e9viter que cette m\u00e9thode soit utilis\u00e9 \u00e0 l&rsquo;ext\u00e9rieur du contexte du patron \u00ab\u00a0Observeur\u00a0\u00bb.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">PRODUIT<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">OBSERVABLE<\/span>\r\n\t\t<span class=\"kr\">rename<\/span>\r\n\t\t\t<span class=\"n\">make<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">make_observable<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">make_observable<\/span>\r\n\t\t\t<span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"\"<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">nom<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_nom<\/span>\r\n\r\n\t<span class=\"n\">set_nom<\/span><span class=\"p\">(<\/span><span class=\"n\">a_nom<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_nom<\/span>\r\n\t\t\t<span class=\"n\">informe<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">prix<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_prix<\/span>\r\n\r\n\t<span class=\"n\">set_prix<\/span><span class=\"p\">(<\/span><span class=\"n\">a_prix<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">prix<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_prix<\/span>\r\n\t\t\t<span class=\"n\">informe<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">AFFICHEUR_PRODUIT<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">OBSERVEUR<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">texte<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"\"<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"nc\">PRODUIT<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">actualisation<\/span><span class=\"p\">(<\/span><span class=\"n\">a_produit<\/span><span class=\"p\">:<\/span><span class=\"nc\">PRODUIT<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">texte<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Le produit \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_produit<\/span><span class=\"p\">.<\/span><span class=\"n\">nom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" au prix de \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_produit<\/span><span class=\"p\">.<\/span><span class=\"n\">prix<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Ici, on peut voir que lors d&rsquo;une red\u00e9finition en Eiffel, on peut modifier le type d&rsquo;un argument, en autant que le nouvel argument soit de type descendant du type d&rsquo;origine.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Ex\u00e9cute l'application.<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">l_produit<\/span><span class=\"p\">:<\/span><span class=\"nc\">PRODUIT<\/span>\r\n\t\t\t<span class=\"n\">l_afficheur<\/span><span class=\"p\">:<\/span><span class=\"nc\">AFFICHEUR_PRODUIT<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_produit<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_afficheur<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"n\">l_produit<\/span><span class=\"p\">.<\/span><span class=\"n\">attache<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_afficheur<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_produit<\/span><span class=\"p\">.<\/span><span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Ordinateur\"<\/span>\r\n\t\t\t<span class=\"n\">l_produit<\/span><span class=\"p\">.<\/span><span class=\"n\">prix<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">200<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">l_afficheur<\/span><span class=\"p\">.<\/span><span class=\"n\">texte<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>Visiteur<\/h3>\n<p>Le patron <strong>visiteur<\/strong> (ou \u00ab\u00a0<strong>visitor<\/strong>\u00ab\u00a0)permet d&rsquo;ajouter un algorithme qui s&rsquo;applique \u00e0 une classe en particulier, mais sans avoir \u00e0 modifier les m\u00e9thodes de la classe. Il est g\u00e9n\u00e9ralement pr\u00e9f\u00e9rable de mettre la m\u00e9thode dans la classe en tant que telle; mais il peut arriver que ce type de patron soit avantageux. Par exemple, pour garder la classe simple d&rsquo;utilisation; ou bien dans le cas ou il est impossible de mettre une m\u00e9thode dans la classe (par exemple, dans une interface en langage objet avec h\u00e9ritage simple seulement).<\/p>\n<p><a href=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/visiteur.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10267 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/visiteur.png\" alt=\"\" width=\"1156\" height=\"582\" \/><\/a><\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">ElementComptable<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">ElementComptableVisiteur<\/span> <span class=\"n\">visiteur<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Produit<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">ElementComptable<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">prix<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Produit<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setPrix<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aPrix<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">prix<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aPrix<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getPrix<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prix<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">ElementComptableVisiteur<\/span> <span class=\"n\">visiteur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">visiteur<\/span><span class=\"p\">.<\/span><span class=\"na\">visiteProduit<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Client<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">ElementComptable<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">numeroTelephone<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Client<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">numeroTelephone<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNumeroTelephone<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNumeroTelephone<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">numeroTelephone<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNumeroTelephone<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNumeroTelephone<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">numeroTelephone<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">ElementComptableVisiteur<\/span> <span class=\"n\">visiteur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">visiteur<\/span><span class=\"p\">.<\/span><span class=\"na\">visiteClient<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Facture<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">ElementComptable<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">total<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">numero<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setTotal<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aTotal<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">total<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aTotal<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getTotal<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">total<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNumero<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aNumero<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">numero<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNumero<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getNumero<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">numero<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">ElementComptableVisiteur<\/span> <span class=\"n\">visiteur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">visiteur<\/span><span class=\"p\">.<\/span><span class=\"na\">visiteFacture<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">ElementComptableVisiteur<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">visiteProduit<\/span><span class=\"p\">(<\/span><span class=\"n\">Produit<\/span> <span class=\"n\">aProduit<\/span><span class=\"p\">);<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">visiteClient<\/span><span class=\"p\">(<\/span><span class=\"n\">Client<\/span> <span class=\"n\">aClient<\/span><span class=\"p\">);<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">visiteFacture<\/span><span class=\"p\">(<\/span><span class=\"n\">Facture<\/span> <span class=\"n\">aFacture<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Afficheur<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">ElementComptableVisiteur<\/span><span class=\"p\"> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">visiteProduit<\/span><span class=\"p\">(<\/span><span class=\"n\">Produit<\/span> <span class=\"n\">aProduit<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le produit \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aProduit<\/span><span class=\"p\">.<\/span><span class=\"na\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> \r\n                <span class=\"s\">\" au prix de \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aProduit<\/span><span class=\"p\">.<\/span><span class=\"na\">getPrix<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"$\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">visiteClient<\/span><span class=\"p\">(<\/span><span class=\"n\">Client<\/span> <span class=\"n\">aClient<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le client appel\u00e9 \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aClient<\/span><span class=\"p\">.<\/span><span class=\"na\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> \r\n                <span class=\"s\">\" qui peut \u00eatre rejoint au \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aClient<\/span><span class=\"p\">.<\/span><span class=\"na\">getNumeroTelephone<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">visiteFacture<\/span><span class=\"p\">(<\/span><span class=\"n\">Facture<\/span> <span class=\"n\">aFacture<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"La facture num\u00e9ro \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aFacture<\/span><span class=\"p\">.<\/span><span class=\"na\">getNumero<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> \r\n                <span class=\"s\">\" totalise \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aFacture<\/span><span class=\"p\">.<\/span><span class=\"na\">getTotal<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"$\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Produit<\/span> <span class=\"n\">produit<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Produit<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">Client<\/span> <span class=\"n\">client<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Client<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">Facture<\/span> <span class=\"n\">facture<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Facture<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">Afficheur<\/span> <span class=\"n\">afficheur<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Afficheur<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"na\">setNom<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Ordinateur\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"na\">setPrix<\/span><span class=\"p\">(<\/span><span class=\"mi\">200<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"na\">setNom<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Louis M\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"na\">setNumeroTelephone<\/span><span class=\"p\">(<\/span><span class=\"s\">\"555-123-4567\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">facture<\/span><span class=\"p\">.<\/span><span class=\"na\">setNumero<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">facture<\/span><span class=\"p\">.<\/span><span class=\"na\">setTotal<\/span><span class=\"p\">(<\/span><span class=\"mi\">1000<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"na\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">afficheur<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"na\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">afficheur<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">facture<\/span><span class=\"p\">.<\/span><span class=\"na\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">afficheur<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">ELEMENT_COMPTABLE<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_visiteur<\/span><span class=\"p\">:<\/span><span class=\"nc\">ELEMENT_COMPTABLE_VISITEUR<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">deferred<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">PRODUIT<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">ELEMENT_COMPTABLE<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"\"<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">nom<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_nom<\/span>\r\n\r\n\t<span class=\"n\">set_nom<\/span><span class=\"p\">(<\/span><span class=\"n\">a_nom<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_nom<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">prix<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_prix<\/span>\r\n\r\n\t<span class=\"n\">set_prix<\/span><span class=\"p\">(<\/span><span class=\"n\">a_prix<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">prix<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_prix<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_visiteur<\/span><span class=\"p\">:<\/span><span class=\"nc\">ELEMENT_COMPTABLE_VISITEUR<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">a_visiteur<\/span><span class=\"p\">.<\/span><span class=\"n\">visite_produit<\/span> <span class=\"p\">(<\/span><span class=\"kc\">Current<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">CLIENT<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">ELEMENT_COMPTABLE<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"\"<\/span>\r\n\t\t\t<span class=\"n\">numero_telephone<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"\"<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">nom<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_nom<\/span>\r\n\r\n\t<span class=\"n\">set_nom<\/span><span class=\"p\">(<\/span><span class=\"n\">a_nom<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_nom<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">numero_telephone<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_numero_telephone<\/span>\r\n\r\n\t<span class=\"n\">set_numero_telephone<\/span><span class=\"p\">(<\/span><span class=\"n\">a_numero_telephone<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">numero_telephone<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_numero_telephone<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_visiteur<\/span><span class=\"p\">:<\/span><span class=\"nc\">ELEMENT_COMPTABLE_VISITEUR<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">a_visiteur<\/span><span class=\"p\">.<\/span><span class=\"n\">visite_client<\/span> <span class=\"p\">(<\/span><span class=\"kc\">Current<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">FACTURE<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">ELEMENT_COMPTABLE<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">numero<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_numero<\/span>\r\n\r\n\t<span class=\"n\">set_numero<\/span><span class=\"p\">(<\/span><span class=\"n\">a_numero<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">numero<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_numero<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">total<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_total<\/span>\r\n\r\n\t<span class=\"n\">set_total<\/span><span class=\"p\">(<\/span><span class=\"n\">a_total<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">total<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_total<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">accepte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_visiteur<\/span><span class=\"p\">:<\/span><span class=\"nc\">ELEMENT_COMPTABLE_VISITEUR<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">a_visiteur<\/span><span class=\"p\">.<\/span><span class=\"n\">visite_facture<\/span> <span class=\"p\">(<\/span><span class=\"kc\">Current<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">deferred<\/span> <span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">ELEMENT_COMPTABLE_VISITEUR<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">visite_produit<\/span><span class=\"p\">(<\/span><span class=\"n\">a_produit<\/span><span class=\"p\">:<\/span><span class=\"nc\">PRODUIT<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">deferred<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">visite_client<\/span><span class=\"p\">(<\/span><span class=\"n\">a_client<\/span><span class=\"p\">:<\/span><span class=\"nc\">CLIENT<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">deferred<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">visite_facture<\/span><span class=\"p\">(<\/span><span class=\"n\">a_facture<\/span><span class=\"p\">:<\/span><span class=\"nc\">FACTURE<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">deferred<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">AFFICHEUR<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\t<span class=\"nc\">ELEMENT_COMPTABLE_VISITEUR<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">visite_produit<\/span><span class=\"p\">(<\/span><span class=\"n\">a_produit<\/span><span class=\"p\">:<\/span><span class=\"nc\">PRODUIT<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le produit \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_produit<\/span><span class=\"p\">.<\/span><span class=\"n\">nom<\/span> <span class=\"o\">+<\/span>\r\n                  <span class=\"s\">\" au prix de \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_produit<\/span><span class=\"p\">.<\/span><span class=\"n\">prix<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"$%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">visite_client<\/span><span class=\"p\">(<\/span><span class=\"n\">a_client<\/span><span class=\"p\">:<\/span><span class=\"nc\">CLIENT<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le client appel\u00e9 \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_client<\/span><span class=\"p\">.<\/span><span class=\"n\">nom<\/span> <span class=\"o\">+<\/span>\r\n                  <span class=\"s\">\" qui peut \u00eatre rejoint au \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_client<\/span><span class=\"p\">.<\/span><span class=\"n\">numero_telephone<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">visite_facture<\/span><span class=\"p\">(<\/span><span class=\"n\">a_facture<\/span><span class=\"p\">:<\/span><span class=\"nc\">FACTURE<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"La facture num\u00e9ro \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_facture<\/span><span class=\"p\">.<\/span><span class=\"n\">numero<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span>\r\n                  <span class=\"s\">\" totalise \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_facture<\/span><span class=\"p\">.<\/span><span class=\"n\">total<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"$%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Ex\u00e9cute l'application.<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">produit<\/span><span class=\"p\">:<\/span><span class=\"nc\">PRODUIT<\/span>\r\n\t\t\t<span class=\"n\">client<\/span><span class=\"p\">:<\/span><span class=\"nc\">CLIENT<\/span>\r\n\t\t\t<span class=\"n\">facture<\/span><span class=\"p\">:<\/span><span class=\"nc\">FACTURE<\/span>\r\n\t\t\t<span class=\"n\">afficheur<\/span><span class=\"p\">:<\/span><span class=\"nc\">AFFICHEUR<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">facture<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">afficheur<\/span>\r\n\t\t\t<span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Ordinateur\"<\/span>\r\n\t\t\t<span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"n\">prix<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">200<\/span>\r\n\t\t\t<span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Louis M\"<\/span>\r\n\t\t\t<span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"n\">numero_telephone<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"555-123-4567\"<\/span>\r\n\t\t\t<span class=\"n\">facture<\/span><span class=\"p\">.<\/span><span class=\"n\">numero<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">1<\/span>\r\n\t\t\t<span class=\"n\">facture<\/span><span class=\"p\">.<\/span><span class=\"n\">total<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">1000<\/span>\r\n\t\t\t<span class=\"n\">produit<\/span><span class=\"p\">.<\/span><span class=\"n\">accepte<\/span> <span class=\"p\">(<\/span><span class=\"n\">afficheur<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"n\">accepte<\/span> <span class=\"p\">(<\/span><span class=\"n\">afficheur<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">facture<\/span><span class=\"p\">.<\/span><span class=\"n\">accepte<\/span> <span class=\"p\">(<\/span><span class=\"n\">afficheur<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Les codes pr\u00e9c\u00e9dents donnent le r\u00e9sultat:<\/p>\n<pre>Le produit Ordinateur au prix de 200$\r\nLe client appel\u00e9 Louis M qui peut \u00eatre rejoint au 555-123-4567\r\nLa facture num\u00e9ro 1 totalise 1000$<\/pre>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/les-cours\/programmation-orientee-objet-2\/\">Retour<\/a><\/p>\n<hr \/>\n<p>Auteur: Louis Marchand<br \/>\n<a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/i.creativecommons.org\/l\/by\/4.0\/80x15.png\" alt=\"Creative Commons License\" \/><\/a><br \/>\nSauf pour les sections sp\u00e9cifi\u00e9es autrement, ce travail est sous licence <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\">Creative Commons Attribution 4.0 International<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction On appelle patrons conceptuels (ou \u00ab\u00a0Design pattern \u00ab\u00a0) un arrangement \u00e9prouv\u00e9 de classes afin de r\u00e9pondre \u00e0 un probl\u00e8me classique. Un patron de conception est consid\u00e9r\u00e9 comme un ensemble de bonnes pratiques dans le domaine du d\u00e9veloppement logiciel. Les patrons de cr\u00e9ation Singleton Un singleton est une instance unique d&rsquo;une classe dans un programme.&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/objet2-patrons-conceptuels\/\">Continue reading <span class=\"screen-reader-text\">Patrons conceptuels<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-251","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/comments?post=251"}],"version-history":[{"count":34,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/251\/revisions"}],"predecessor-version":[{"id":844,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/251\/revisions\/844"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}