{"id":1790,"date":"2019-04-13T08:34:22","date_gmt":"2019-04-13T08:34:22","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=1790"},"modified":"2024-12-16T22:32:38","modified_gmt":"2024-12-16T19:32:38","slug":"visitor-pattern","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2019\/04\/13\/visitor-pattern\/","title":{"rendered":"Padr\u00e3o de visitante"},"content":{"rendered":"<p><em>Neste post irei descrever um padr\u00e3o de design chamado &#8220;Visitante&#8221; ou &#8220;Visitante&#8221;<br \/><\/em>Este padr\u00e3o pertence ao grupo de <strong>Padr\u00f5es de comportamento<\/strong>.<\/p>\n<h3>Vamos encontrar um problema<\/h3>\n<p>Esse padr\u00e3o \u00e9 usado principalmente para contornar a limita\u00e7\u00e3o do envio \u00fanico em linguagens de liga\u00e7\u00e3o antecipada.<\/p>\n<p><a href=\"https:\/\/www.flickr.com\/photos\/nfg\/16506635470\/in\/photostream\/\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1798\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/04\/kinbaku.jpg\" alt=\"\" width=\"420\" height=\"640\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.flickr.com\/photos\/nfg\/16506635470\/in\/photostream\/\" target=\"_blank\" rel=\"noopener noreferrer\">Alice X<\/a> por <a href=\"https:\/\/nfgphoto.com\" target=\"_blank\" rel=\"noopener noreferrer\">NFGPhoto<\/a> (<a href=\"https:\/\/creativecommons.org\/licenses\/by\/2.0\/\" target=\"_blank\" rel=\"noopener noreferrer\">CC-2.0<\/a>)<br \/>Vamos criar uma classe\/protocolo abstrato Band, fazer uma subclasse de MurpleDeep, criar uma classe Visitor com dois m\u00e9todos &#8211; um para enviar qualquer descendente de Band para o console, o segundo para gerar qualquer MurpleDeep, o principal \u00e9 que os nomes (assinaturas) dos m\u00e9todos sejam os mesmos e os argumentos diferem apenas por classe. Usando o m\u00e9todo de impress\u00e3o intermedi\u00e1rio com o argumento Band, criamos uma inst\u00e2ncia de Visitor e chamamos o m\u00e9todo visit para MurpleDeep.<br \/>Abaixo est\u00e1 o c\u00f3digo em Kotlin:<br \/><!-- iframe plugin v.5.1 wordpress.org\/plugins\/iframe\/ --><br \/>\n<iframe loading=\"lazy\" src=\"https:\/\/pl.kotl.in\/qsxky0Z8C\" width=\"360\" height=\"400\" scrolling=\"yes\" class=\"iframe-class\" frameborder=\"0\"><\/iframe>\n<\/p>\n<p>A sa\u00edda ser\u00e1 &#8220;<strong><span class=\"standard-output darcula\">Esta \u00e9 a classe Band<\/span><\/strong>&#8220;<\/p>\n<h3>Como isso \u00e9 poss\u00edvel?!<\/h3>\n<p>Por que isso acontece \u00e9 descrito em palavras inteligentes em muitos artigos, inclusive em russo, mas sugiro que voc\u00ea imagine como o compilador v\u00ea o c\u00f3digo, talvez tudo fique claro imediatamente:<br \/><!-- iframe plugin v.5.1 wordpress.org\/plugins\/iframe\/ --><br \/>\n<iframe loading=\"lazy\" src=\"https:\/\/pl.kotl.in\/oBsgszLCO\" width=\"360\" height=\"500\" scrolling=\"yes\" class=\"iframe-class\" frameborder=\"0\"><\/iframe>\n<\/p>\n<h3>Resolvendo o problema<\/h3>\n<p>Existem muitas solu\u00e7\u00f5es para resolver este problema, a seguir consideraremos uma solu\u00e7\u00e3o usando o padr\u00e3o Visitor.<br \/>Adicionamos o m\u00e9todo Accept com o argumento Visitor \u00e0 classe\/protocolo abstrato, chamamos Visitor.visit(this) dentro do m\u00e9todo e, em seguida, adicionamos uma substitui\u00e7\u00e3o\/implementa\u00e7\u00e3o do m\u00e9todo Accept \u00e0 classe MurpleDeep, violando DRY de forma decisiva e calma, novamente escrevendo visitante.visita(este).< br \/>C\u00f3digo final:<br \/><!-- iframe plugin v.5.1 wordpress.org\/plugins\/iframe\/ --><br \/>\n<iframe loading=\"lazy\" src=\"https:\/\/pl.kotl.in\/0fvYomzJd\" width=\"360\" height=\"500\" scrolling=\"yes\" class=\"iframe-class\" frameborder=\"0\"><\/iframe>\n<\/p>\n<h3>Fontes<\/h3>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/visitor-double-dispatch\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/refactoring.guru\/ru\/ padr\u00f5es de design\/visitor-double-dispatch<\/a><\/p>\n<h3>C\u00f3digo fonte<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/patterns\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/patterns<\/a><\/p >\n","protected":false},"excerpt":{"rendered":"<p>Neste post irei descrever um padr\u00e3o de design chamado &#8220;Visitante&#8221; ou &#8220;Visitante&#8221;Este padr\u00e3o pertence ao grupo de Padr\u00f5es de comportamento. Vamos encontrar um problema Esse padr\u00e3o \u00e9 usado principalmente para contornar a limita\u00e7\u00e3o do envio \u00fanico em linguagens de liga\u00e7\u00e3o antecipada. Alice X por NFGPhoto (CC-2.0)Vamos criar uma classe\/protocolo abstrato Band, fazer uma subclasse de<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/2019\/04\/13\/visitor-pattern\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Padr\u00e3o de visitante&#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":[95,98],"class_list":["post-1790","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-patterns","tag-visitor","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"pt","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\/pt\/wp-json\/wp\/v2\/posts\/1790","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1790"}],"version-history":[{"count":38,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1790\/revisions"}],"predecessor-version":[{"id":3960,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1790\/revisions\/3960"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1790"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1790"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1790"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}