{"id":4832,"date":"2023-06-01T18:50:43","date_gmt":"2023-06-01T21:50:43","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?p=4832"},"modified":"2023-10-21T21:36:28","modified_gmt":"2023-10-22T00:36:28","slug":"bridge-adapter-e-proxy-tres-padroes-essenciais-para-o-design-de-sistemas-flexiveis","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/bridge-adapter-e-proxy-tres-padroes-essenciais-para-o-design-de-sistemas-flexiveis\/","title":{"rendered":"Bridge, Adapter e Proxy: Tr\u00eas padr\u00f5es essenciais para o design de sistemas flex\u00edveis"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Padr\u00e3o <em>Bridge<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">O que \u00e9 o padr\u00e3o <em>Bridge<\/em>?<\/h3>\n\n\n\n<p>O padr\u00e3o <em>Bridge<\/em> \u00e9 um padr\u00e3o de design estrutural que tem a inten\u00e7\u00e3o de &#8220;desacoplar uma abstra\u00e7\u00e3o de sua implementa\u00e7\u00e3o, de modo que as duas possam variar independentemente&#8221;. Parece complexo? Vamos simplificar: imagine que voc\u00ea tem um controle remoto de TV. A forma como o controle funciona \u00e9 a abstra\u00e7\u00e3o, e a marca ou modelo do controle \u00e9 a implementa\u00e7\u00e3o. Com o padr\u00e3o <em>Bridge<\/em>, voc\u00ea pode alterar a forma como o controle funciona ou mudar a marca ou modelo sem que um interfira no outro.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quando usar o padr\u00e3o <em>Bridge<\/em>?<\/h3>\n\n\n\n<p>Recomendo a utiliza\u00e7\u00e3o do padr\u00e3o <em>Bridge <\/em>quando voc\u00ea quer evitar um v\u00ednculo permanente entre a abstra\u00e7\u00e3o e a implementa\u00e7\u00e3o. Isso pode ser \u00fatil quando a implementa\u00e7\u00e3o deve ser selecionada ou alterada em tempo de execu\u00e7\u00e3o.<\/p>\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\">C#<\/span><span role=\"button\" tabindex=\"0\" data-code=\"using System;\n\n\/\/ Abstra\u00e7\u00e3o\nabstract class Abstraction\n{\n    protected Implementor implementor;\n\n    public Abstraction(Implementor implementor)\n    {\n        this.implementor = implementor;\n    }\n\n    public abstract void Operation();\n}\n\n\/\/ Implementa\u00e7\u00e3o\ninterface Implementor\n{\n    void OperationImp();\n}\n\n\/\/ Implementa\u00e7\u00e3o Concreta A\nclass ConcreteImplementorA : Implementor\n{\n    public void OperationImp()\n    {\n        Console.WriteLine(&quot;Implementa\u00e7\u00e3o A sendo executada.&quot;);\n    }\n}\n\n\/\/ Implementa\u00e7\u00e3o Concreta B\nclass ConcreteImplementorB : Implementor\n{\n    public void OperationImp()\n    {\n        Console.WriteLine(&quot;Implementa\u00e7\u00e3o B sendo executada.&quot;);\n    }\n}\n\n\/\/ Abstra\u00e7\u00e3o Refinada\nclass RefinedAbstraction : Abstraction\n{\n    public RefinedAbstraction(Implementor implementor) : base(implementor)\n    {\n    }\n\n    public override void Operation()\n    {\n        Console.WriteLine(&quot;Abstra\u00e7\u00e3o sendo executada.&quot;);\n        implementor.OperationImp();\n    }\n}\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        \/\/ Cria as implementa\u00e7\u00f5es concretas\n        Implementor implementorA = new ConcreteImplementorA();\n        Implementor implementorB = new ConcreteImplementorB();\n\n        \/\/ Cria a abstra\u00e7\u00e3o refinada associada com a implementa\u00e7\u00e3o A\n        Abstraction abstraction = new RefinedAbstraction(implementorA);\n        abstraction.Operation();\n\n        Console.WriteLine();\n\n        \/\/ Altera a implementa\u00e7\u00e3o associada \u00e0 abstra\u00e7\u00e3o para a implementa\u00e7\u00e3o B\n        abstraction.implementor = implementorB;\n        abstraction.Operation();\n\n        Console.ReadLine();\n    }\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: #81A1C1\">using<\/span><span style=\"color: #D8DEE9FF\"> System<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Abstra\u00e7\u00e3o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Abstraction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">protected<\/span><span style=\"color: #D8DEE9FF\"> Implementor implementor<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Abstraction<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Implementor implementor<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">implementor<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">implementor<\/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>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Operation<\/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: #616E88\">\/\/ Implementa\u00e7\u00e3o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">interface<\/span><span style=\"color: #D8DEE9FF\"> Implementor<\/span><\/span>\n<span class=\"line\"><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\">OperationImp<\/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: #616E88\">\/\/ Implementa\u00e7\u00e3o Concreta A<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ConcreteImplementorA<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> Implementor<\/span><\/span>\n<span class=\"line\"><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\">OperationImp<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Implementa\u00e7\u00e3o A sendo executada.<\/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: #616E88\">\/\/ Implementa\u00e7\u00e3o Concreta B<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ConcreteImplementorB<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> Implementor<\/span><\/span>\n<span class=\"line\"><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\">OperationImp<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Implementa\u00e7\u00e3o B sendo executada.<\/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: #616E88\">\/\/ Abstra\u00e7\u00e3o Refinada<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">RefinedAbstraction<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> Abstraction<\/span><\/span>\n<span class=\"line\"><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: #88C0D0\">RefinedAbstraction<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Implementor implementor<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">base<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">implementor<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/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\">override<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Operation<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Abstra\u00e7\u00e3o sendo executada.<\/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: #D8DEE9\">implementor<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">OperationImp<\/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\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Program<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> args<\/span><span style=\"color: #ECEFF4\">)<\/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 style=\"color: #616E88\">\/\/ Cria as implementa\u00e7\u00f5es concretas<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Implementor implementorA <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> ConcreteImplementorA<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Implementor implementorB <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> ConcreteImplementorB<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Cria a abstra\u00e7\u00e3o refinada associada com a implementa\u00e7\u00e3o A<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Abstraction abstraction <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> RefinedAbstraction<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">implementorA<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">abstraction<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Operation<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Altera a implementa\u00e7\u00e3o associada \u00e0 abstra\u00e7\u00e3o para a implementa\u00e7\u00e3o B<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">abstraction<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">implementor<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">implementorB<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">abstraction<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Operation<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">ReadLine<\/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: #616E88\">\/\/ Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, temos a abstra\u00e7\u00e3o <code>Abstraction<\/code> que possui uma refer\u00eancia para a interface <code>Implementor<\/code>. As classes <code>ConcreteImplementorA<\/code> e <code>ConcreteImplementorB<\/code> s\u00e3o as implementa\u00e7\u00f5es concretas da interface <code>Implementor<\/code>. A classe <code>RefinedAbstraction<\/code> \u00e9 uma abstra\u00e7\u00e3o refinada que estende a classe <code>Abstraction<\/code>. O programa principal cria as implementa\u00e7\u00f5es concretas, associa a abstra\u00e7\u00e3o refinada com a implementa\u00e7\u00e3o A, executa a opera\u00e7\u00e3o e, em seguida, altera a implementa\u00e7\u00e3o para B e executa novamente a opera\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Padr\u00e3o <em>Adapter<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">O que \u00e9 o padr\u00e3o <em>Adapter<\/em>?<\/h3>\n\n\n\n<p>Agora vamos falar sobre o padr\u00e3o <em>Adapter<\/em>. Ele \u00e9 um padr\u00e3o de design estrutural que permite que duas interfaces incompat\u00edveis trabalhem juntas. \u00c9 como um tradutor entre dois idiomas incompat\u00edveis. Em outras palavras, o padr\u00e3o <em>Adapter<\/em> cria uma ponte entre duas interfaces que de outra forma n\u00e3o poderiam trabalhar juntas devido a suas interfaces incompat\u00edveis.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quando usar o padr\u00e3o <em>Adapter<\/em>?<\/h3>\n\n\n\n<p>Voc\u00ea deve considerar o uso do padr\u00e3o <em>Adapter <\/em>quando quiser usar uma classe existente que seja incompat\u00edvel com o restante do seu c\u00f3digo. Ou quando quiser criar uma classe reutiliz\u00e1vel que coopere com classes n\u00e3o relacionadas ou n\u00e3o previstas.<\/p>\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\">C#<\/span><span role=\"button\" tabindex=\"0\" data-code=\"using System;\n\n\/\/ Interface existente\ninterface ITarget\n{\n    void Request();\n}\n\n\/\/ Classe existente\nclass Adaptee\n{\n    public void SpecificRequest()\n    {\n        Console.WriteLine(&quot;M\u00e9todo SpecificRequest da classe Adaptee sendo chamado.&quot;);\n    }\n}\n\n\/\/ Adapter\nclass Adapter : ITarget\n{\n    private Adaptee adaptee;\n\n    public Adapter(Adaptee adaptee)\n    {\n        this.adaptee = adaptee;\n    }\n\n    public void Request()\n    {\n        Console.WriteLine(&quot;Adapter chamando o m\u00e9todo SpecificRequest da classe Adaptee.&quot;);\n        adaptee.SpecificRequest();\n    }\n}\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        \/\/ Cria a inst\u00e2ncia da classe Adaptee\n        Adaptee adaptee = new Adaptee();\n\n        \/\/ Cria o Adapter e passa a inst\u00e2ncia do Adaptee\n        ITarget target = new Adapter(adaptee);\n\n        \/\/ Chama o m\u00e9todo Request do Adapter\n        target.Request();\n\n        Console.ReadLine();\n    }\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: #81A1C1\">using<\/span><span style=\"color: #D8DEE9FF\"> System<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Interface existente<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">interface<\/span><span style=\"color: #D8DEE9FF\"> ITarget<\/span><\/span>\n<span class=\"line\"><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\">Request<\/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: #616E88\">\/\/ Classe existente<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Adaptee<\/span><\/span>\n<span class=\"line\"><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\">SpecificRequest<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">M\u00e9todo SpecificRequest da classe Adaptee sendo chamado.<\/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: #616E88\">\/\/ Adapter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Adapter<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> ITarget<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> Adaptee adaptee<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Adapter<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Adaptee adaptee<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">adaptee<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">adaptee<\/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>\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\">Request<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Adapter chamando o m\u00e9todo SpecificRequest da classe Adaptee.<\/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: #D8DEE9\">adaptee<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">SpecificRequest<\/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\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Program<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> args<\/span><span style=\"color: #ECEFF4\">)<\/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 style=\"color: #616E88\">\/\/ Cria a inst\u00e2ncia da classe Adaptee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Adaptee adaptee <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Adaptee<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Cria o Adapter e passa a inst\u00e2ncia do Adaptee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ITarget target <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Adapter<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">adaptee<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Chama o m\u00e9todo Request do Adapter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">target<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Request<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">ReadLine<\/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: #616E88\">\/\/ Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, temos a interface <code>ITarget<\/code> que define a interface esperada pelo cliente. A classe <code>Adaptee<\/code> \u00e9 a classe existente que possui uma interface incompat\u00edvel com <code>ITarget<\/code>. A classe <code>Adapter<\/code> implementa a interface <code>ITarget<\/code> e atua como um adaptador entre o cliente e a classe <code>Adaptee<\/code>. No programa principal, criamos uma inst\u00e2ncia de <code>Adaptee<\/code>, criamos um <code>Adapter<\/code> passando a inst\u00e2ncia do <code>Adaptee<\/code> e chamamos o m\u00e9todo <code>Request<\/code> do <code>Adapter<\/code>, que internamente chama o m\u00e9todo <code>SpecificRequest<\/code> da classe <code>Adaptee<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Padr\u00e3o <em>Proxy<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">O que \u00e9 o padr\u00e3o <em>Proxy<\/em>?<\/h3>\n\n\n\n<p>Chegamos agora ao padr\u00e3o <em>Proxy<\/em>. Esse padr\u00e3o de design estrutural fornece um substituto ou espa\u00e7o reservado para outro objeto para controlar o acesso a ele. \u00c9 como um intermedi\u00e1rio que pode adicionar funcionalidades extras ao objeto sem mudar sua interface.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quando usar o padr\u00e3o <em>Proxy<\/em>?<\/h3>\n\n\n\n<p>O padr\u00e3o <em>Proxy <\/em>\u00e9 \u00fatil quando voc\u00ea precisa controlar o acesso a um objeto, seja para adicionar uma camada de seguran\u00e7a, otimizar o desempenho, entre outros.<\/p>\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\">C#<\/span><span role=\"button\" tabindex=\"0\" data-code=\"using System;\n\n\/\/ Interface do objeto real e do proxy\ninterface ISubject\n{\n    void Request();\n}\n\n\/\/ Objeto real\nclass RealSubject : ISubject\n{\n    public void Request()\n    {\n        Console.WriteLine(&quot;RealSubject: Processando a requisi\u00e7\u00e3o.&quot;);\n    }\n}\n\n\/\/ Proxy\nclass Proxy : ISubject\n{\n    private RealSubject realSubject;\n\n    public void Request()\n    {\n        \/\/ Cria o objeto real sob demanda\n        if (realSubject == null)\n        {\n            Console.WriteLine(&quot;Proxy: Criando uma inst\u00e2ncia do RealSubject.&quot;);\n            realSubject = new RealSubject();\n        }\n\n        \/\/ Executa a requisi\u00e7\u00e3o atrav\u00e9s do objeto real\n        realSubject.Request();\n    }\n}\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        \/\/ Cria o proxy\n        ISubject proxy = new Proxy();\n\n        \/\/ Chama o m\u00e9todo Request do proxy\n        proxy.Request();\n\n        Console.ReadLine();\n    }\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: #81A1C1\">using<\/span><span style=\"color: #D8DEE9FF\"> System<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Interface do objeto real e do proxy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">interface<\/span><span style=\"color: #D8DEE9FF\"> ISubject<\/span><\/span>\n<span class=\"line\"><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\">Request<\/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: #616E88\">\/\/ Objeto real<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">RealSubject<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> ISubject<\/span><\/span>\n<span class=\"line\"><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\">Request<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">RealSubject: Processando a requisi\u00e7\u00e3o.<\/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: #616E88\">\/\/ Proxy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Proxy<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> ISubject<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> RealSubject realSubject<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/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\">Request<\/span><span style=\"color: #ECEFF4\">()<\/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 style=\"color: #616E88\">\/\/ Cria o objeto real sob demanda<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">realSubject<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">null<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Proxy: Criando uma inst\u00e2ncia do RealSubject.<\/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: #D8DEE9\">realSubject<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> RealSubject<\/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>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Executa a requisi\u00e7\u00e3o atrav\u00e9s do objeto real<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">realSubject<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Request<\/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\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Program<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> args<\/span><span style=\"color: #ECEFF4\">)<\/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 style=\"color: #616E88\">\/\/ Cria o proxy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ISubject proxy <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Proxy<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Chama o m\u00e9todo Request do proxy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">proxy<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Request<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">ReadLine<\/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: #616E88\">\/\/ Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, temos a interface <code>ISubject<\/code> que define a interface tanto para o objeto real (<code>RealSubject<\/code>) quanto para o proxy (<code>Proxy<\/code>). A classe <code>RealSubject<\/code> representa o objeto real com a funcionalidade que desejamos controlar o acesso. O <code>Proxy<\/code> atua como um substituto do objeto real e controla o acesso a ele. No programa principal, criamos uma inst\u00e2ncia do <code>Proxy<\/code> e chamamos o m\u00e9todo <code>Request<\/code>, que internamente verifica se o objeto real j\u00e1 foi criado ou n\u00e3o. Se n\u00e3o foi criado, o <code>Proxy<\/code> cria uma inst\u00e2ncia do <code>RealSubject<\/code> e em seguida realiza a requisi\u00e7\u00e3o atrav\u00e9s do objeto real.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como esses padr\u00f5es ajudam no design de sistemas flex\u00edveis<\/h2>\n\n\n\n<p>Os padr\u00f5es de design <em>Bridge, Adapter <\/em>e<em> Proxy <\/em>contribuem para o desenvolvimento de sistemas flex\u00edveis e adapt\u00e1veis. Cada um desses padr\u00f5es oferece uma maneira diferente de garantir que as partes do seu sistema possam variar independentemente umas das outras.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como esses padr\u00f5es podem beneficiar o neg\u00f3cio<\/h2>\n\n\n\n<p>Em um contexto de neg\u00f3cios, a utiliza\u00e7\u00e3o desses padr\u00f5es de design pode trazer v\u00e1rios benef\u00edcios, como maior flexibilidade, redu\u00e7\u00e3o de custos com manuten\u00e7\u00e3o e evolu\u00e7\u00e3o do sistema, al\u00e9m de permitir a integra\u00e7\u00e3o com outros sistemas de forma mais f\u00e1cil.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Para finalizar, os padr\u00f5es de design s\u00e3o ferramentas poderosas que podem ajudar a criar sistemas mais flex\u00edveis, de f\u00e1cil manuten\u00e7\u00e3o e interoper\u00e1veis. Espero que este artigo tenha ajudado a esclarecer a import\u00e2ncia dos padr\u00f5es <em>Bridge, Adapter <\/em>e <em>Proxy <\/em>no design de sistemas. Lembre-se: a melhor pr\u00e1tica \u00e9 sempre aquela que melhor se adequa ao seu caso!<\/p>\n\n\n\n<p>Esse conte\u00fado \u00e9 parte do material disponibilizado para os participantes do meu grupo de estudos de\u00a0<strong>Padr\u00f5es de Projeto<\/strong>. Voc\u00ea quer participar desse grupo?\u00a0<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>Qual a diferen\u00e7a entre os padr\u00f5es <em>Bridge, Adapter e Proxy<\/em>?<\/strong><br>A principal diferen\u00e7a \u00e9 a finalidade de cada um deles. O padr\u00e3o <em>Bridge<\/em> \u00e9 usado para separar a abstra\u00e7\u00e3o da implementa\u00e7\u00e3o, o <em>Adapter<\/em> \u00e9 utilizado para compatibilizar interfaces incompat\u00edveis, e o <em>Proxy<\/em> controla o acesso a objetos.<\/p>\n\n\n\n<p><strong>Os padr\u00f5es de design podem ajudar no desenvolvimento de software?<\/strong><br>Sim, os padr\u00f5es de <em>design <\/em>podem ajudar no desenvolvimento de software, tornando-o mais organizado, eficiente e f\u00e1cil de manter.<\/p>\n\n\n\n<p><strong>Todos os sistemas precisam usar esses padr\u00f5es?<\/strong><br>N\u00e3o necessariamente. O uso de padr\u00f5es depende dos requisitos e complexidade do sistema.<\/p>\n\n\n\n<p><strong>O uso de padr\u00f5es de <em>design<\/em> pode ter um impacto negativo?<\/strong><br>Se usados incorretamente, os padr\u00f5es de design podem tornar o sistema excessivamente complexo e dif\u00edcil de entender. \u00c9 importante usar os padr\u00f5es de <em>design<\/em> de forma adequada.<\/p>\n\n\n\n<p><strong>Qual padr\u00e3o de <em>design<\/em> devo usar?<\/strong><br>Depende das necessidades do seu sistema. Cada padr\u00e3o tem suas pr\u00f3prias vantagens e desvantagens, e a decis\u00e3o de usar um padr\u00e3o espec\u00edfico deve ser baseada nas necessidades espec\u00edficas do seu sistema.<\/p>\n","protected":false},"featured_media":4957,"parent":0,"template":"","cursos":[7],"class_list":["post-4832","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\/4832","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\/4957"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=4832"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=4832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}