{"id":1830,"date":"2019-04-20T12:34:04","date_gmt":"2019-04-20T12:34:04","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=1830"},"modified":"2024-12-16T22:32:38","modified_gmt":"2024-12-16T19:32:38","slug":"memento-pattern","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2019\/04\/20\/memento-pattern\/","title":{"rendered":"Mod\u00e8le &#8220;Instantan\u00e9&#8221;"},"content":{"rendered":"<p>Dans cet article, je d\u00e9crirai le mod\u00e8le \u00ab\u00a0Snapshot\u00a0\u00bb\u00a0; ou &#8220;Memento&#8221;<\/p>\n<p>Ce mod\u00e8le fait r\u00e9f\u00e9rence au mod\u00e8le \u00ab comportemental \u00bb. mod\u00e8les de conception.<\/p>\n<h3><a href=\"https:\/\/pxhere.com\/en\/photo\/655263\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1834\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/04\/hipster-camera-1.jpg-1.jpg\" alt=\"\" width=\"360\" height=\"240\" \/><\/a><\/h3>\n<p>Supposons que nous d\u00e9veloppions un \u00e9diteur graphique et que nous devions ajouter la possibilit\u00e9 d&#8217;annuler des actions sur une commande utilisateur. Il est \u00e9galement tr\u00e8s important que les composants du syst\u00e8me n&#8217;aient pas acc\u00e8s \u00e0 l&#8217;\u00e9tat interne des \u00ab actions \u00bb annul\u00e9es lors de l&#8217;impl\u00e9mentation de ce mod\u00e8le ; les autres composants du syst\u00e8me n&#8217;ont acc\u00e8s qu&#8217;\u00e0 l&#8217;objet instantan\u00e9 sans possibilit\u00e9 de le modifier. son \u00e9tat interne, fournissant une interface externe claire et simple. Pour r\u00e9soudre ce probl\u00e8me, le mod\u00e8le \u00ab\u00a0Snapshot\u00a0\u00bb est utilis\u00e9. ou &#8220;Gardien&#8221;.<\/p>\n<p>Exemple de travail &#8220;Snapshot&#8221; pr\u00e9sent\u00e9 ci-dessous\u00a0:<\/p>\n<p><!-- iframe plugin v.5.1 wordpress.org\/plugins\/iframe\/ --><br \/>\n<iframe loading=\"lazy\" src=\"https:\/\/demensdeum.com\/demos\/memento\/index.html\" width=\"400\" height=\"600\" scrolling=\"yes\" class=\"iframe-class\" frameborder=\"0\"><\/iframe><\/p>\n<p>Lorsque vous cliquez dessus, un sprite appara\u00eet, lorsque vous cliquez sur la fl\u00e8che courb\u00e9e, l&#8217;action est annul\u00e9e &#8211; Le sprite dispara\u00eet. L&#8217;exemple se compose de trois classes\u00a0:<\/p>\n<ol>\n<li>Toile sur laquelle les sprites et l&#8217;interface graphique sont affich\u00e9s.<\/li>\n<li>Contr\u00f4leur d&#8217;\u00e9cran, il traite les clics et contr\u00f4le la logique de l&#8217;\u00e9cran.<\/li>\n<li>Les \u00e9tats du canevas qui persistent \u00e0 chaque modification sont annul\u00e9s si n\u00e9cessaire \u00e0 l&#8217;aide du contr\u00f4leur d&#8217;\u00e9cran.<\/li>\n<\/ol>\n<p>Dans le contexte du mod\u00e8le &#8220;Snapshot&#8221; les cours sont\u00a0:<\/p>\n<ol>\n<li>Toile &#8211; source, les \u00e9tats de cette classe sont enregistr\u00e9s sous forme de \u00ab\u00a0instantan\u00e9s\u00a0\u00bb, pour une restauration ult\u00e9rieure sur demande. De plus, la source doit \u00eatre capable de restaurer l&#8217;\u00e9tat lors du transfert d&#8217;un \u00ab instantan\u00e9 \u00bb vers celle-ci.<\/li>\n<li>Contr\u00f4leur &#8211; d\u00e9positaire, cette classe sait comment et quand enregistrer\/annuler les \u00e9tats.<\/li>\n<li>\u00c9tat &#8211; instantan\u00e9, une classe qui stocke l&#8217;\u00e9tat de la source, ainsi que des informations sur la date ou un index \u00e0 partir duquel l&#8217;ordre de restauration peut \u00eatre \u00e9tabli avec pr\u00e9cision.<\/li>\n<\/ol>\n<p>Une caract\u00e9ristique importante du mod\u00e8le est que seule la source doit avoir acc\u00e8s aux champs internes de l&#8217;\u00e9tat enregistr\u00e9 dans l&#8217;instantan\u00e9\u00a0; cela est n\u00e9cessaire pour prot\u00e9ger les instantan\u00e9s des modifications venant de l&#8217;ext\u00e9rieur (des d\u00e9veloppeurs exp\u00e9riment\u00e9s qui souhaitent modifier quelque chose en contournant l&#8217;encapsulation). , brisant la logique du syst\u00e8me). Pour impl\u00e9menter l&#8217;encapsulation, des classes int\u00e9gr\u00e9es sont utilis\u00e9es et, en C++, elles utilisent la possibilit\u00e9 de sp\u00e9cifier des classes amies. Personnellement, j&#8217;ai impl\u00e9ment\u00e9 une version simple sans encapsulation pour Rise et en utilisant Generic lors de l&#8217;impl\u00e9mentation pour Swift. Dans ma version &#8211; Memento donne son \u00e9tat interne uniquement aux entit\u00e9s du m\u00eame \u00e9tat de classe\u00a0:<br \/><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1856\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/04\/stateByRequest.jpg\" alt=\"\" width=\"321\" height=\"203\" \/><\/p>\n<h3>Sources<\/h3>\n<p><a href=\"https:\/\/refactoring.guru\/design-patterns\/memento\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/refactoring.guru\/design-patterns\/memento<\/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>Dans cet article, je d\u00e9crirai le mod\u00e8le \u00ab\u00a0Snapshot\u00a0\u00bb\u00a0; ou &#8220;Memento&#8221; Ce mod\u00e8le fait r\u00e9f\u00e9rence au mod\u00e8le \u00ab comportemental \u00bb. mod\u00e8les de conception. Supposons que nous d\u00e9veloppions un \u00e9diteur graphique et que nous devions ajouter la possibilit\u00e9 d&#8217;annuler des actions sur une commande utilisateur. Il est \u00e9galement tr\u00e8s important que les composants du syst\u00e8me n&#8217;aient pas<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/fr\/2019\/04\/20\/memento-pattern\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Mod\u00e8le &#8220;Instantan\u00e9&#8221;&#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":[100,95],"class_list":["post-1830","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-memento","tag-patterns","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"fr","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"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}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1830","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=1830"}],"version-history":[{"count":32,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1830\/revisions"}],"predecessor-version":[{"id":3959,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1830\/revisions\/3959"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=1830"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=1830"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=1830"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}