Apresentação

Montar script das intenções.
Falar como ler o livro e como vendo padrões similares você vai criando nexo entre eles e vendo pontos de vista diferente do padrão, acabando achando outras maneiras ou maneiras melhores de usar outro padrão. Outro padrão que as vezes pode ser similar ao que está lendo, não sobre somente o que está lendo.
 
FALAR DAS INTENÇÕES, QUE NÃO TEM EXEMPLO DE TUDO MAS DE ALGUNS PADRÕES

Decorator

Também temos o chain of responsability que basicamente pode fazer a mesma coisa. Difereça que o decorator não pode quebrar o fluxo, como o chain of responsability pode. Falar do exemplo com JWT, para verificar se pode fazer aquilo ou não, que vai para o cara que ve se o cara tem permissão, outro para fazer a consulta e dai retornar.
 
Muito interessante nesta de mexer sem quebrar, dar uma olhada no adaptater e proxy.
 
Adapter é para quando você teum sistema que tratava tudo como XML, então vocÊ faz m adapter para começar a retornar JSON, sem mxer em nada na estrutura inicial, diferneça que vocÊ vai chamar o adapter que chama o XML e te retorna tratado.
 
O padrão bridge serve para quebrar em duas hearaquias duas classes intimamente ligadas. Exemplo seria você vai ter um controle remoto, que recebe no construtor o Device. Device que vai ser implementado em diferentes tipos, como radio e tv, ambos vão ter aqueles comandos de ligar, desligar, avançar e voltar que o controle espera ter para chamar. Também permite você pegar aquele controle remoto e extender em controle remoto avançado, que vai ser uma função extra. Então na hora que for usar esse controle remoto extra, é só usar ele invés do controle normal
 
Proxy por exemplo, você fez uma aplicação que não usava o cache. Porém agora precisa usar o cache, então uma solução seria você fazer um proxy que iria verificar se você tem o cache valido do id do que está buscando, se tiver retornar ele se não fazer uma nova req. para a classe de serviço. Nesse caso você chamaria GetVideoProxy().
O composite também é similar, por usar da composição recursiva. Você vai ter um função que você chama a draw, esse função vai chamar outra função draw (por exemplo) e vai indo... ALgo como um pedido, que tem notebook X com montior X de brinde, cada um dessses tem acessórios. Quando via acioniar a garantia, você vai assionar a garantia do pedido, que vai chamar o monitor, que vai cahamar a garantia do acessorio
→ Para formar um cubo voce precisa de 6 quadrados, que tem 2 triagulos cada e cada trinagulo tem 3 pontos
 
Já que esamos falando de trabalhar com algo que já existia, também tem o facade que as vezes você quer simplificar o uso de algo que já existe mas sem mecher na classe. Então você faz o facade, que antes você tinha que saber qual tipo de codec vídeo chamar. Então vocÊ cria um facade que vai receber o seu arquivo e ele vai tratar. Você tem isso em apenas um pedaço do código invés de cada vez que precisa de um codec ser tratado isso.
→ Quer manter inteface e ocultar a complexidade das classes que estão por tras desta classe.
 
Também algo que pode fazer você voltar para o seu código ou código do amigo, é ele estando muito pesado. Para isso, talvez uma solução possa te ajudar que á flyweight. Nele vai te ensinar técnicas de controlar o estado em memória, um objeto que sempre vai ter aquele valor você não ficar criando todo objeto novo com a mesma coisa, vocÊ pode deixar ele apontando predaço memmoria já existente. → Se parece com um singleton, explicar do cubo que tem X quadrados, que cada quadrado tem 2 triagulos. Ele usa o factory para atingir isso:
// A classe flyweight contém uma parte do estado de uma árvore // Esses campos armazenam valores que são únicos para cada // árvore em particular. Por exemplo, você não vai encontrar // coordenadas da árvore aqui. Já que esses dados geralmente são // GRANDES, você gastaria muita memória mantendo-os em cada // objeto árvore. Ao invés disso, nós podemos extrair a textura, // cor e outros dados repetitivos em um objeto separado os quais // muitas árvores individuais podem referenciar. class TreeType is field name field color field texture constructor TreeType(name, color, texture) { ... } method draw(canvas, x, y) is // 1. Cria um bitmap de certo tipo, cor e textura. // 2. Desenha o bitmap em uma tela nas coordenadas X e // Y. // A fábrica flyweight decide se reutiliza o flyweight existente // ou cria um novo objeto. class TreeFactory is static field treeTypes: collection of tree types static method getTreeType(name, color, texture) is type = treeTypes.find(name, color, texture) if (type == null) type = new TreeType(name, color, texture) treeTypes.add(type) return type // O objeto contextual contém a parte extrínseca do estado da // árvore. Uma aplicação pode criar bilhões desses estados, já // que são muito pequenos: // apenas dois números inteiros para coordenadas e um campo de // referência. class Tree is field x,y field type: TreeType constructor Tree(x, y, type) { ... } method draw(canvas) is type.draw(canvas, this.x, this.y) // As classes Tree (Árvore) e Forest (Floresta) são os clientes // flyweight. Você pode uni-las se não planeja desenvolver mais // a classe Tree. class Forest is field trees: collection of Trees method plantTree(x, y, name, color, texture) is type = TreeFactory.getTreeType(name, color, texture) tree = new Tree(x, y, type) trees.add(tree) method draw(canvas) is foreach (tree in trees) do tree.draw(canvas)
 
#### Outros padrões que não falei:
Singleton ele é como um flyweight. Ele apenas vai ter uma intancia do objeto
Tem o interator que é muito usado em estrutura de dados, para percorrer uma lista você vai ter um interator para fazer isso, dentro do interator vai estar a logica da estrutura de dados necessaria ou favorita. GetNExt
 
Tem o mediator que do dofactory está com zero estrelas de popularidade, o que ele vem solucionar é vocÊ ter um mediator que vai vocè vai jogar algo para ele, dentro dele ele vai tratar para retornar o resultado esperado. O problema disso, que deve dar a baixa reputação dele que ele pode envoluir para um objeto deus, que vai saber tudo da sua aplicação. Para ele usem outros design patterns melhores como Chain of Responsibility, Command, e Observer. Facade é muito parecido também

O memento é basicamente o cara que vai te guardar o snapshop de um objeto que estaja mechendo, para caso precise restaurar para a versão que foi feito o snapshopt por um metodo chamado backup. Interessante salvar data no snapshot para ter controle, cuidado com o gasto de ram da máquina com isso. O grande tchan deste cara, que quem vai te mandar o salvar no snapshot vai ser o proprio cara que agora vai ter backup, isso é encapsulado. Legal que tu salva coisas internas e tem certeza de tudo, porém talvez só salvar você mesmo os props que vão para a função talvez resolva se a função for pura.
 
Com o padrão visitor, você adiciona a função accept(visitor: VisitorOrtofragia), que vai chamar uma função que esá dentro do visitor, passando o this como param. Dentro do seu visitor vai ter essa função, que vai esperar o objeto que chamou o Aceppt, neste caso o Paragraph. Para dai fazer o tratamento e retornar.
 
Pode ter um que você faz o accepts nas formas geometricas, que chaam o visitor que exporta para XML. Então o acept vai chamar a função que transforma o circulo seu em um xml. Na hora do uso, você vai passar no Visitor as formas geometricas que quer jogar em um XML (o ex. anteriro faz com palavras) e vai chamar visitorToXML.export, que vai fazer um forEach das formas que passou como parametro
 
Aqui pode ver, que o interpreter não pode ser usado para tudo.
 
O interpreter é feito como próprio nome sugere, para interpretar algum dado. Como o yyyy-mm-dd, que ele vai receber o date e vai interpretar para aquele formato de data movo
 
colocar slide singleton e falar comparar com flyweight.. Colocar relogio para ver se estou muito tempo
COLOCAR SOLID E SLIDE DOS OUTROS PADROES