{"id":1966,"date":"2019-05-26T15:02:25","date_gmt":"2019-05-26T15:02:25","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=1966"},"modified":"2024-12-16T22:32:37","modified_gmt":"2024-12-16T19:32:37","slug":"mediator-pattern","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2019\/05\/26\/mediator-pattern\/","title":{"rendered":"M\u00e9diateur de mod\u00e8le"},"content":{"rendered":"<p>Le mod\u00e8le Mediator fait r\u00e9f\u00e9rence \u00e0 des mod\u00e8les de conception comportementale.<br \/><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1995\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/05\/guitarPick.jpg\" alt=\"\" width=\"320\" height=\"213\" \/><br \/>\nUn jour, vous recevez une commande pour d\u00e9velopper une application de blague &#8211; l&#8217;utilisateur appuie sur un bouton au milieu de l&#8217;\u00e9cran et un dr\u00f4le de bruit de canard cancan se fait entendre.<br \/>Une fois t\u00e9l\u00e9charg\u00e9e sur l&#8217;App Store, l&#8217;application fait un carton : tout le monde cancane avec votre application, Elon Musk cancane sur son Instagram lors du prochain lancement d&#8217;un tunnel \u00e0 tr\u00e8s grande vitesse sur Mars, Hillary Clinton devance Donald Trump lors du d\u00e9bat. et remporte les \u00e9lections en Ukraine, succ\u00e8s\u00a0!<br \/>L&#8217;impl\u00e9mentation na\u00efve de l&#8217;application ressemble \u00e0 ceci\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>class DuckButton {\n    func didPress() {\n        print(\"quack!\")\n    }\n}\n\nlet duckButton = DuckButton()\nduckButton.didPress()\n<\/code><\/pre>\n<\/div>\n<p>Ensuite, vous d\u00e9cidez d&#8217;ajouter le son d&#8217;un chien qui aboie, pour cela, vous devez afficher deux boutons pour s\u00e9lectionner le son &#8211; avec un canard et un chien. Cr\u00e9ons deux classes de boutons\u00a0: DuckButton et DogButton.<br \/>Changez le code\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>class DuckButton {\n    func didPress() {\n        print(\"quack!\")\n    }\n}\n\nclass DogButton {\n    func didPress() {\n        print(\"bark!\")\n    }\n}\n\nlet duckButton = DuckButton()\nduckButton.didPress()\n\nlet dogButton = DogButton()\ndogButton.didPress()\n<\/code><\/pre>\n<\/div>\n<p>Apr\u00e8s un autre succ\u00e8s, nous ajoutons le son d&#8217;un cri de cochon, il y a maintenant trois classes de boutons\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>class DuckButton {\n    func didPress() {\n        print(\"quack!\")\n    }\n}\n\nclass DogButton {\n    func didPress() {\n        print(\"bark!\")\n    }\n}\n\nclass PigButton {\n    func didPress() {\n        print(\"oink!\")\n    }\n}\n\nlet duckButton = DuckButton()\nduckButton.didPress()\n\nlet dogButton = DogButton()\ndogButton.didPress()\n\nlet pigButton = PigButton()\npigButton.didPress()\n<\/code><\/pre>\n<\/div>\n<p>Les utilisateurs se plaignent du fait que les sons se chevauchent.<br \/>Nous ajoutons une v\u00e9rification pour \u00e9viter que cela ne se produise, et en m\u00eame temps nous pr\u00e9sentons les classes les unes aux autres\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>class DuckButton {\n    var isMakingSound = false\n    var dogButton: DogButton?\n    var pigButton: PigButton?\n    func didPress() {\n        guard dogButton?.isMakingSound ?? false == false &&\n                pigButton?.isMakingSound ?? false == false else { return }\n        isMakingSound = true\n        print(\"quack!\")\n        isMakingSound = false\n    }\n}\n\nclass DogButton {\n    var isMakingSound = false\n    var duckButton: DuckButton?\n    var pigButton: PigButton?\n    func didPress() {\n        guard duckButton?.isMakingSound ?? false == false &&\n                pigButton?.isMakingSound ?? false == false else { return }\n        isMakingSound = true\n        print(\"bark!\")\n        isMakingSound = false\n    }\n}\n\nclass PigButton {\n    var isMakingSound = false\n    var duckButton: DuckButton?\n    var dogButton: DogButton?\n    func didPress() {\n        guard duckButton?.isMakingSound ?? false == false && \n                dogButton?.isMakingSound ?? false == false else { return }\n        isMakingSound = true\n        print(\"oink!\")\n        isMakingSound = false\n    }\n}\n\nlet duckButton = DuckButton()\nduckButton.didPress()\n\nlet dogButton = DogButton()\ndogButton.didPress()\n\nlet pigButton = PigButton()\npigButton.didPress()\n<\/code><\/pre>\n<\/div>\n<p>Suite au succ\u00e8s de votre candidature, le gouvernement d\u00e9cide de promulguer une loi selon laquelle les cancans, aboiements et grognements sur les appareils mobiles ne peuvent \u00eatre effectu\u00e9s que de 9h00 \u00e0 15h00 le reste de la semaine\u00a0; Dans ce cas, l&#8217;utilisateur de votre application risque une peine de 5 ans de prison pour production sonore obsc\u00e8ne \u00e0 l&#8217;aide d&#8217;appareils \u00e9lectroniques personnels.<br \/>Changez le code\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>import Foundation\n\nextension Date {\n    func mobileDeviceAllowedSoundTime() -> Bool {\n        let hour = Calendar.current.component(.hour, from: self)\n        let weekend = Calendar.current.isDateInWeekend(self)\n        \n        let result = hour >= 9 && hour <= 14 &#038;&#038; weekend == false\n        \n        return result\n    }\n}\n\nclass DuckButton {\n    var isMakingSound = false\n    var dogButton: DogButton?\n    var pigButton: PigButton?\n    func didPress() {\n        guard dogButton?.isMakingSound ?? false == false &#038;&#038;\n                pigButton?.isMakingSound ?? false == false &#038;&#038;\n                 Date().mobileDeviceAllowedSoundTime() == true else { return }\n        isMakingSound = true\n        print(\"quack!\")\n        isMakingSound = false\n    }\n}\n\nclass DogButton {\n    var isMakingSound = false\n    var duckButton: DuckButton?\n    var pigButton: PigButton?\n    func didPress() {\n        guard duckButton?.isMakingSound ?? false == false &#038;&#038;\n                pigButton?.isMakingSound ?? false == false &#038;&#038;\n                 Date().mobileDeviceAllowedSoundTime() == true else { return }\n        isMakingSound = true\n        print(\"bark!\")\n        isMakingSound = false\n    }\n}\n\nclass PigButton {\n    var isMakingSound = false\n    var duckButton: DuckButton?\n    var dogButton: DogButton?\n    func didPress() {\n        guard duckButton?.isMakingSound ?? false == false &#038;&#038; \n                dogButton?.isMakingSound ?? false == false &#038;&#038;\n                 Date().mobileDeviceAllowedSoundTime() == true else { return }\n        isMakingSound = true\n        print(\"oink!\")\n        isMakingSound = false\n    }\n}\n\nlet duckButton = DuckButton()\nlet dogButton = DogButton()\nlet pigButton = PigButton()\n\nduckButton.dogButton = dogButton\nduckButton.pigButton = pigButton\n\ndogButton.duckButton = duckButton\ndogButton.pigButton = pigButton\n\npigButton.duckButton = duckButton\npigButton.dogButton = dogButton\n\nduckButton.didPress()\ndogButton.didPress()\npigButton.didPress()\n<\/code><\/pre>\n<\/div>\n<p>Soudain, l'application de lampe de poche commence \u00e0 chasser la n\u00f4tre du march\u00e9, ne la laissons pas nous vaincre et ajoutez une lampe de poche en appuyant sur le bouton \u00ab oink-oink \u00bb et sur le reste des boutons\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>import Foundation\n\nextension Date {\n    func mobileDeviceAllowedSoundTime() -> Bool {\n        let hour = Calendar.current.component(.hour, from: self)\n        let weekend = Calendar.current.isDateInWeekend(self)\n        \n        let result = hour >= 9 && hour <= 14 &#038;&#038; weekend == false\n        \n        return result\n    }\n}\n\nclass Flashlight {\n\n    var isOn = false\n\n    func turn(on: Bool) {\n        isOn = on\n    }\n}\n\nclass DuckButton {\n    var isMakingSound = false\n    var dogButton: DogButton?\n    var pigButton: PigButton?\n    var flashlight: Flashlight?\n    func didPress() {\n        flashlight?.turn(on: true)\n        guard dogButton?.isMakingSound ?? false == false &#038;&#038;\n                pigButton?.isMakingSound ?? false == false &#038;&#038;\n                 Date().mobileDeviceAllowedSoundTime() == true else { return }\n        isMakingSound = true\n        print(\"quack!\")\n        isMakingSound = false\n    }\n}\n\nclass DogButton {\n    var isMakingSound = false\n    var duckButton: DuckButton?\n    var pigButton: PigButton?\n    var flashlight: Flashlight?\n    func didPress() {\n        flashlight?.turn(on: true)\n        guard duckButton?.isMakingSound ?? false == false &#038;&#038;\n                pigButton?.isMakingSound ?? false == false &#038;&#038;\n                 Date().mobileDeviceAllowedSoundTime() == true else { return }\n        isMakingSound = true\n        print(\"bark!\")\n        isMakingSound = false\n    }\n}\n\nclass PigButton {\n    var isMakingSound = false\n    var duckButton: DuckButton?\n    var dogButton: DogButton?\n    var flashlight: Flashlight?\n    func didPress() {\n        flashlight?.turn(on: true)\n        guard duckButton?.isMakingSound ?? false == false &#038;&#038; \n                dogButton?.isMakingSound ?? false == false &#038;&#038;\n                 Date().mobileDeviceAllowedSoundTime() == true else { return }\n        isMakingSound = true\n        print(\"oink!\")\n        isMakingSound = false\n    }\n}\n\nlet flashlight = Flashlight()\nlet duckButton = DuckButton()\nlet dogButton = DogButton()\nlet pigButton = PigButton()\n\nduckButton.dogButton = dogButton\nduckButton.pigButton = pigButton\nduckButton.flashlight = flashlight\n\ndogButton.duckButton = duckButton\ndogButton.pigButton = pigButton\ndogButton.flashlight = flashlight\n\npigButton.duckButton = duckButton\npigButton.dogButton = dogButton\npigButton.flashlight = flashlight\n\nduckButton.didPress()\ndogButton.didPress()\npigButton.didPress()\n<\/code><\/pre>\n<\/div>\n<p>En cons\u00e9quence, nous avons une \u00e9norme application qui contient beaucoup de code copi\u00e9-coll\u00e9, les classes \u00e0 l'int\u00e9rieur sont reli\u00e9es entre elles par un lien mort - il n'y a pas de couplage faible, un tel miracle est tr\u00e8s difficile \u00e0 maintenir et changement dans le futur en raison des fortes chances de commettre une erreur.<\/p >\n<h3>Utiliser le m\u00e9diateur<\/h3>\n<p>Ajoutons une classe de m\u00e9diateur interm\u00e9diaire\u00a0:\u00a0ApplicationController. Cette classe fournira un couplage l\u00e2che des objets, garantira la s\u00e9paration des responsabilit\u00e9s entre les classes et \u00e9liminera le code en double.<br \/>R\u00e9\u00e9crivons\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>import Foundation\n\nclass ApplicationController {\n\n    private var isMakingSound = false\n    private let flashlight = Flashlight()\n    private var soundButtons: [SoundButton] = []\n\n    func add(soundButton: SoundButton) {\n        soundButtons.append(soundButton)\n    }\n    \n    func didPress(soundButton: SoundButton) {\n        flashlight.turn(on: true)\n        guard Date().mobileDeviceAllowedSoundTime() && \n                isMakingSound == false else { return }\n        isMakingSound = true\n        soundButton.didPress()\n        isMakingSound = false\n    }\n}\n\nclass SoundButton {\n    let soundText: String\n    \n    init(soundText: String) {\n        self.soundText = soundText\n    }\n    \n    func didPress() {\n        print(soundText)\n    }\n}\n\nclass Flashlight {\n    var isOn = false\n\n    func turn(on: Bool) {\n        isOn = on\n    }\n}\n\nextension Date {\n    func mobileDeviceAllowedSoundTime() -> Bool {\n        let hour = Calendar.current.component(.hour, from: self)\n        let weekend = Calendar.current.isDateInWeekend(self)\n        \n        let result = hour >= 9 && hour <= 14 &#038;&#038; weekend == false\n        \n        return result\n    }\n}\n\nlet applicationController = ApplicationController()\nlet pigButton = SoundButton(soundText: \"oink!\")\nlet dogButton = SoundButton(soundText: \"bark!\")\nlet duckButton = SoundButton(soundText: \"quack!\")\n\napplicationController.add(soundButton: pigButton)\napplicationController.add(soundButton: dogButton)\napplicationController.add(soundButton: duckButton)\n\npigButton.didPress()\ndogButton.didPress()\nduckButton.didPress()\n<\/code><\/pre>\n<\/div>\n<p>De nombreux articles sur les architectures d'applications d'interface utilisateur d\u00e9crivent le mod\u00e8le MVC et ses d\u00e9riv\u00e9s. Le mod\u00e8le est utilis\u00e9 pour travailler avec des donn\u00e9es de logique m\u00e9tier, la vue ou la repr\u00e9sentation montre des informations \u00e0 l'utilisateur dans l'interface\/fournit une interaction avec l'utilisateur, le contr\u00f4leur est un m\u00e9diateur qui assure l'interaction des composants du syst\u00e8me.<\/p>\n<h3>Sources<\/h3>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/mediator\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/refactoring.guru\/ru\/design-patterns\/ m\u00e9diateur<\/a><\/p>\n<h3>Code source<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/patterns\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/patterns\/<\/a>< \/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le mod\u00e8le Mediator fait r\u00e9f\u00e9rence \u00e0 des mod\u00e8les de conception comportementale. Un jour, vous recevez une commande pour d\u00e9velopper une application de blague &#8211; l&#8217;utilisateur appuie sur un bouton au milieu de l&#8217;\u00e9cran et un dr\u00f4le de bruit de canard cancan se fait entendre.Une fois t\u00e9l\u00e9charg\u00e9e sur l&#8217;App Store, l&#8217;application fait un carton : tout<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/fr\/2019\/05\/26\/mediator-pattern\/\">Continue reading <span class=\"screen-reader-text\">&#8220;M\u00e9diateur de mod\u00e8le&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[103,95],"class_list":["post-1966","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-mediator","tag-patterns","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"fr","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1966","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=1966"}],"version-history":[{"count":31,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1966\/revisions"}],"predecessor-version":[{"id":3958,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1966\/revisions\/3958"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=1966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=1966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=1966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}