Design Patterns
Tags: programming, braziliandevs
Published: 2022-08-03 04:03:04

Design Patterns são um conjunto de soluções comuns para problemas recorrentes, inicialmente foram definidos pela Gang of Four (GoF) lá em 1994 no livro `Design Patterns: Elements of Reusable Object-Oriented Software`

> Muitos padrões são utilizados até hoje como o singleton por exemplo que é usando por [padrão no nestjs](https://docs.nestjs.com/fundamentals/injection-scopes) sempre que fazemos uma injeção de dependências. No entanto eles não são uma bala de prata e devem ser utilizados com cuidado

> Nesse artigo vou falar sobre alguns dos designs mas se quiser conhecer outros e principalmente ver implementações deles recomendo que leia o livro original ou utilize esse site https://refactoring.guru/pt-br/design-patterns/catalog onde além de exemplos bem simples de entender qual o problema que estamos tentando resolver com os patterns ele ainda tem exemplos de implementação em diversas linguagens

## Adapters

O adpters é uma forma de abstrair libs externas deixando o código flexível  então por exemplo no javascript temos diversas bibliotecas com o intuito de lidar com datas (dateFns, DayJs, momentjs), a ideia desse padrão é, ao invés de utilizar diretamente a lib na classe onde vamos manipular datas, criarmos uma interface que declara todos os métodos que vamos utilizar e receber essa interface no construtor da classe que queremos manipular as datas, assim podemos facilmente trocar a implementação dessa interface por diversas libs diferentes porem para nossa classe não vai fazer diferença pois ela sempre vai estar chamando o método definido na interface, não importando quem implementou ele e nem como que ele foi implementado

## Decorators

A ideia do decorator é que quando uma classe pode conter mais de uma logica pertencente a ela, nos podemos passar uma outra instancia dela para ela mesma para que ela consiga chamar essas novas instancias, por exemplo, vamos supor que estou criando um modulo de notificações, onde quero enviar a notificação para o celular da pessoa então cria uma instancia que extende a classe notificações porém tem a logica de mandar a notificação para o celular, e crio também uma instancia para enviar e-mail da mesma forma, agora supondo que eu precise enviar uma notificação que é Celular + E-mail, o padrão então sugere que ao invés de chamarmos uma notificação e depois a outra, todas as notificações possam receber uma outra notificação no seu construtor e ir chamando a próxima até que não tenha recebido mais nenhuma, dessa forma podemos misturar as notificações de diversas formas

## Composite

Muito semelhante ao Decorators mas com diferença que a hierarquia importa mais. A ideia é deixar a gente compor objetos na estrutura de arvore e depois ir trabalhando com esses objetos de forma individual, então por exemplo se queremos saber o preço total de um pedido podemos receber itens que compõem esse pedido ou até mesmo um pedido anterior que vai compor esse pedido, e a ideia é percorrermos esse pedido anterior buscando o valor dele para somar com o valor dos itens do pedido atual e termos um valor total

## Facade

A ideia é ter um objeto que funciona como uma fachada escondendo um processo complexo onde tem que ser chamados vários métodos em ordens especificas, ao invés de deixar isso para o cliente nos podemos criar uma fachada com um método único que vai executar tudo na ordem que deve ser executada escondendo essa complexidade do cliente

## Proxy

O proxy tem como objetivo otimizar o tempo das chamadas, então por exemplo se eu preciso fazer algo que gasta muito recurso eu posso criar uma classe proxy que tem acesso a essa classe que queremos evitar chamar a toa, e então utilizamos a classe proxy para saber se a classe mais pesada deve ou não ser chamada, por exemplo, quero pegar um dado do banco de dados mas não tenho acesso, se eu fizer a chamada pelo proxy ele n vai deixar nem eu tentar acessar, mas se eu fizer normalmente eu vou conseguir e provavelmente vai falhar a chamada, outra utilização é usar o proxy como uma espécie de cache, digamos que eu precise de um valor que para conseguir esse valor eu preciso fazer uma conta complexa que demora muito tempo, se mais na frente na mesma execução eu precise desse valor novamente, o proxy pode me retornar ele direto