[MÚSICA] [MÚSICA] Olá a todos. Meu nome é Eduardo Guerra. Esse é o Curso de Desenvolvimento Ágil com Padrões de Projeto e essa é a aula de Proxies e Decorators. São dois padrões que eu gosto muito, são muito parecidos, eu vou explicar pouquinho essa similaridade deles nessa aula. São dois padrões que eu gosto e uso bastante, são realmente essenciais e por isso a gente colocou módulo aqui no nosso curso, especialmente para esses padrões. Então a gente vai, nessa aula, aprender a encapsular objetos com classes que podem adicionar funcionalidades a uma classe já existente. Vamos ver como é que é isso daí. Então muitas vezes a pessoa fala "Para que eu preciso de criar uma abstração", ou seja, eu tenho lá uma classe eu vou criar uma interface que eu nunca vou querer trocar aquela implementação. Para quê que eu vou abstrair aquilo ali. Acontece que, muitas vezes, por mais que você não vá trocar a implementação final ali você pode querer acrescentar outras coisas, como por exemplo, segurança, auditoria, validação, às vezes notificar alguém. Então, tudo isso daí podem ser funcionalidades que vão entrar complementando aquela funcionalidade principal. E nessa hora, é bem interessante a gente poder ter essa abstração justamente para poder colocar cara ali encapsulando, como se fosse a nossa classe. Então, essa estrutura é a estrutura básica do Proxy e do Decorator. Para a gente que viu no módulo anterior a composição recursiva vai ver que essa estrutura é bem familiar. Então, o que acontece, a gente cria uma classe que seria uma classe intermediária. Que acontece? Ela é composta, diferentemente do Composite, que ela é composta por várias instâncias da abstração, o intermediário é composto por uma instância da abstração. Então, o quê que ele faz? Ele acrescenta uma funcionalidade, ou seja, quando método for chamado ali, ele vai fazer alguma coisa e pode fazer alguma coisa, ele chama o método original, o objeto original, quando esse cara retornar o intermediário ele tem mais oportunidades de fazer alguma coisa com aquele resultado antes de retornar. De uma certa forma, ele acaba encapsulando aquele objeto principal. E a gente tem esses dois padrões que tem uma estrutura bem similar, o Decorator e o Proxy. A gente vai ver pouquinho da diferença entre esses dois padrões. Então, tanto quanto outro, a gente tem o objeto original encapsulado por esse intermediário ou seja, como o intermediário ele tem a mesma abstração desse objeto original, você não vai saber exatamente com quais dos dois você está lidando. Então, a presença desse intermediário, ela vai ser transparente ali aquela caixinha do cliente, ou seja, a classe que está chamando a funcionalidade. Ou seja, ela não vai saber que tem cara entre o objeto original e ele, fazendo alguma coisa adicional, como por exemplo, validando os os dados, verificando alguma coisa de segurança e etc. Sendo que, como esse intermediário chama o método no objeto original ele tem oportunidade para adicionar funcionalidade tanto antes quanto depois da execução desse método. Então, como eu falei anteriormente, a gente pode ver aí, a classe cliente não vai saber se ela está falando com o objeto original, se ela está falando com o intermediário. Ela sabe que ela depende da abstração, com qual dos dois ela está falando ela não vai saber. Então, o Proxy tem essa estrutura. Como a gente pode ver, ele não tem explicitamente aquele composição. Acaba que o Proxy é muito utilizado, por exemplo, quando você tem acesso remoto. Então, por exemplo, eu preciso acessar uma classe que está outro computador, então, eu crio aqui na minha máquina local representante, intermediário. Se a gente pegar o significado da palavra proxy é justamente esse, intermediário. E aí eu vou chamar os métodos nesse intermediário, como se fosse na classe que está remota, e ele vai cuidar de fazer essa chamada remota. Por causa disso, não necessariamente a classe que ele está chamando compõe ele justamente por não, necessariamente, estar no mesmo lugar, na mesma máquina. Mas o conceito ele é bastante similar como se estivesse ali uma composição. Já o padrão Decorator ele tem aquela estrutura da composição recursiva que a gente já conhece, que eu já mostrei aqui nessa aula mesmo. Ele tem ali o Decorator na ideia de, por exemplo, como se a classe original fosse quadro e o Decorator fosse a moldura desse quadro. Ou seja, ele está acrescentando alguma coisa algo que já existe. Então, dando essa ideia do encapsulamento, de estar adicionando alguma coisa. Então, mais uma vez, como eu falei, ambos os padrões utilizam a composição recursiva. Eu vejo muita classe com a mesma estrutura do Decorator sendo chamada de Proxy, eu acho na minha opinião, os dois padrões são bem similares. Então, por causa disso, eu vou chamar agora tudo de Proxy mas, nessa aula, acho que deu para entender aí pouquinho a diferença pouco subtil dos dois padrões. Certo? Bom. A gente só entende mesmo o valor do Proxy quando a gente usa ele para coisas que a gente enxerga o valor de como elas são úteis. Então, não perca a próxima aula que a gente vai estar falando de alguns exemplos de uso do Proxy. Enquanto isso, espero que você tenha compreendido bem os padrões Proxy e Decorator, também entre os meus favoritos. Muito obrigado. [MÚSICA] [MÚSICA]