{"id":7838,"date":"2023-09-25T08:53:23","date_gmt":"2023-09-25T11:53:23","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?p=7838"},"modified":"2023-10-21T21:33:00","modified_gmt":"2023-10-22T00:33:00","slug":"dominando-o-padrao-de-projeto-adapter-indo-alem-do-basico","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/dominando-o-padrao-de-projeto-adapter-indo-alem-do-basico\/","title":{"rendered":"Dominando o Padr\u00e3o de Projeto Adapter: Indo Al\u00e9m do B\u00e1sico"},"content":{"rendered":"\n<p>Em um mundo de sistemas de software complexos e em constante evolu\u00e7\u00e3o, a necessidade de integra\u00e7\u00e3o entre componentes muitas vezes nos coloca diante de interfaces incompat\u00edveis. O Padr\u00e3o de Projeto Adapter \u00e9 a solu\u00e7\u00e3o cl\u00e1ssica para esse desafio, mas h\u00e1 muito mais a ser explorado al\u00e9m do b\u00e1sico. Mesmo para os desenvolvedores s\u00eanior, o Adapter reserva nuances e aspectos que podem transformar a maneira como sistemas se comunicam. Neste artigo, mergulharemos profundamente no Padr\u00e3o Adapter, revelando insights avan\u00e7ados que o ajudar\u00e3o a se destacar na arte da integra\u00e7\u00e3o de sistemas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Desvendando o Padr\u00e3o Adapter<\/h2>\n\n\n\n<p>Em sua ess\u00eancia, o Padr\u00e3o Adapter atua como um &#8220;adaptador&#8221; entre duas interfaces incompat\u00edveis, permitindo que objetos de diferentes sistemas cooperem harmoniosamente. No entanto, a profundidade desse padr\u00e3o vai muito al\u00e9m dessa defini\u00e7\u00e3o b\u00e1sica. Vamos explorar os aspectos avan\u00e7ados do Padr\u00e3o Adapter:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. <strong>Adapter de Classe vs. Adapter de Objeto<\/strong><\/h3>\n\n\n\n<p>O Padr\u00e3o Adapter pode ser implementado de duas maneiras principais: como um Adapter de Classe e como um Adapter de Objeto. Enquanto o Adapter de Classe herda da classe que precisa ser adaptada, o Adapter de Objeto mant\u00e9m uma inst\u00e2ncia da classe que precisa de adapta\u00e7\u00e3o. Saber escolher entre essas abordagens \u00e9 crucial para uma integra\u00e7\u00e3o eficiente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong>Adaptadores M\u00faltiplos (Multiple Adapters)<\/strong><\/h3>\n\n\n\n<p>Em cen\u00e1rios complexos, pode ser necess\u00e1rio adaptar uma \u00fanica interface para v\u00e1rias interfaces diferentes. O Adapter M\u00faltiplo permite que um objeto se comunique com diversos sistemas por meio de diferentes adaptadores. Isso \u00e9 particularmente \u00fatil em situa\u00e7\u00f5es de integra\u00e7\u00e3o onde a heterogeneidade de interfaces \u00e9 alta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. <strong>Adapter de Duas Vias (Two-Way Adapter)<\/strong><\/h3>\n\n\n\n<p>Nem sempre a adapta\u00e7\u00e3o \u00e9 unilateral. Em alguns casos, voc\u00ea precisa permitir que o objeto adaptado tamb\u00e9m seja acessado pela interface do adaptador. O Adapter de Duas Vias resolve esse problema, tornando poss\u00edvel a comunica\u00e7\u00e3o em ambas as dire\u00e7\u00f5es.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. <strong>Adapter Parametrizado (Parameterized Adapter)<\/strong><\/h3>\n\n\n\n<p>\u00c0s vezes, voc\u00ea precisa adaptar objetos com interfaces que aceitam par\u00e2metros ou configura\u00e7\u00f5es espec\u00edficas. O Adapter Parametrizado permite que voc\u00ea especifique esses par\u00e2metros durante a adapta\u00e7\u00e3o, tornando a integra\u00e7\u00e3o mais flex\u00edvel e personaliz\u00e1vel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implementa\u00e7\u00f5es em Diferentes Linguagens<\/h2>\n\n\n\n<p>O Padr\u00e3o Adapter \u00e9 uma abordagem amplamente aplic\u00e1vel e pode ser implementado em diversas linguagens de programa\u00e7\u00e3o. A seguir, veremos exemplos de implementa\u00e7\u00f5es em Java e Python:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementa\u00e7\u00e3o em Java<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Java<\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Exemplo de Adapter de Classe\nclass LegacyLibrary {\n    void doSomethingOld() {\n        System.out.println(&quot;Doing something the old way.&quot;);\n    }\n}\n\ninterface Target {\n    void doSomething();\n}\n\nclass AdapterClass extends LegacyLibrary implements Target {\n    public void doSomething() {\n        doSomethingOld();\n    }\n}\n\/\/\/ Fonte: ChatGPT\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ Exemplo de Adapter de Classe<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">LegacyLibrary<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">doSomethingOld<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Doing something the old way.<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">interface<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Target<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">doSomething<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">AdapterClass<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">extends<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB; font-weight: bold\">LegacyLibrary<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">implements<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB; font-weight: bold\">Target<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">doSomething<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">doSomethingOld<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/\/ Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Implementa\u00e7\u00e3o em Python<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Exemplo de Adapter de Objeto\nclass LegacyLibrary:\n    def do_something_old(self):\n        print(&quot;Doing something the old way.&quot;)\n\nclass Target:\n    def do_something(self):\n        pass\n\nclass AdapterObject(Target):\n    def __init__(self, legacy_instance):\n        self.legacy = legacy_instance\n\n    def do_something(self):\n        self.legacy.do_something_old()\n\n# Fonte: ChatGPT\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #616E88\"># Exemplo de Adapter de Objeto<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">LegacyLibrary<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">do_something_old<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Doing something the old way.<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Target<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">do_something<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">pass<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">AdapterObject<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #8FBCBB; font-weight: bold\">Target<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">__init__<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">legacy_instance<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">legacy <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> legacy_instance<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">do_something<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">legacy<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">do_something_old<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Dominar o Padr\u00e3o de Projeto Adapter \u00e9 fundamental para resolver os desafios de integra\u00e7\u00e3o de sistemas de forma eficiente e elegante. Al\u00e9m de compreender a adapta\u00e7\u00e3o b\u00e1sica de interfaces, explorar aspectos avan\u00e7ados como Adapter de Classe, Adapter de Objeto, Adaptadores M\u00faltiplos, Adapter de Duas Vias e Adapter Parametrizado \u00e9 essencial. O Padr\u00e3o Adapter oferece uma gama de solu\u00e7\u00f5es para a integra\u00e7\u00e3o de sistemas complexos, permitindo que voc\u00ea se destaque na cria\u00e7\u00e3o de solu\u00e7\u00f5es excepcionais de software. Portanto, aprofunde-se nesse padr\u00e3o e leve suas habilidades de desenvolvimento a um n\u00edvel superior.<\/p>\n\n\n\n<p>Esse conte\u00fado \u00e9 parte do material disponibilizado para os participantes do meu grupo de estudos de&nbsp;<strong>Padr\u00f5es de Projeto<\/strong>. Voc\u00ea quer participar desse grupo?&nbsp;<strong><a href=\"https:\/\/elemarjr.com\/clube-de-estudos\/gof-design-patterns\/\">Clique aqui e veja como funciona<\/a><\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00favidas Frequentes<\/h2>\n\n\n\n<p><strong>O que \u00e9 o Padr\u00e3o de Projeto Adapter e quando devo us\u00e1-lo?<\/strong><br>O Padr\u00e3o de Projeto Adapter \u00e9 uma solu\u00e7\u00e3o para conectar interfaces incompat\u00edveis. Voc\u00ea deve us\u00e1-lo sempre que precisar que objetos de diferentes sistemas se comuniquem de maneira harmoniosa, adaptando uma interface existente para atender \u00e0s necessidades de outra.<\/p>\n\n\n\n<p><strong>Qual \u00e9 a diferen\u00e7a entre Adapter de Classe e Adapter de Objeto?<\/strong><br>O Adapter de Classe herda da classe que precisa ser adaptada, enquanto o Adapter de Objeto mant\u00e9m uma inst\u00e2ncia da classe que precisa de adapta\u00e7\u00e3o. O Adapter de Classe \u00e9 \u00fatil quando voc\u00ea deseja criar uma nova classe que herda funcionalidade, enquanto o Adapter de Objeto \u00e9 prefer\u00edvel quando a composi\u00e7\u00e3o \u00e9 mais adequada.<\/p>\n\n\n\n<p><strong>Quando devo usar um Adapter de Duas Vias?<\/strong><br>Use um Adapter de Duas Vias quando precisar que a interface do objeto adaptado tamb\u00e9m seja acess\u00edvel atrav\u00e9s da interface do adaptador. Isso \u00e9 \u00fatil quando a comunica\u00e7\u00e3o deve ocorrer em ambas as dire\u00e7\u00f5es.<\/p>\n\n\n\n<p><strong>Em que cen\u00e1rios o Adapter M\u00faltiplo \u00e9 mais \u00fatil?<\/strong><br>O Adapter M\u00faltiplo \u00e9 valioso em cen\u00e1rios onde um \u00fanico objeto precisa ser adaptado para se comunicar com v\u00e1rias interfaces diferentes. Isso \u00e9 especialmente \u00fatil quando voc\u00ea lida com sistemas heterog\u00eaneos que possuem v\u00e1rias interfaces incompat\u00edveis.<\/p>\n","protected":false},"featured_media":7885,"parent":0,"template":"","cursos":[7],"class_list":["post-7838","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-gof"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/7838","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos"}],"about":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/types\/artigos"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media\/7885"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=7838"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=7838"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}