e fala pessoal nessa aula a gente vai falar sobre o padrão de projeto strategy and aqui e esse padrão de projeto ele é de outra categoria então a gente está trocando também a categoria que a gente tá falando a gente começou falando da categoria creation que seriam os padrões criacionais depois a gente falou dos trolls seriam os padrões de projeto estruturais e agora a gente vai entrar na categoria b í vel seriam os padrões de projeto comportamentais o striped é um padrão de projeto comportamental e agora a gente vai falar só de para grande projeto
comportamentais a dito isso a gente pode ver agora o que que essa categoria o quais são os padrões de projetos o que que esses padrões projeto resolvem aqui no nosso o nosso programa né então os padrões de projeto comportamentais se preocupam com algum algoritmo a atribuição de responsabilidade entre os objetos e os padrões de comunicação entre eles dentre todos esses padrões aqui eu acho que a gente vai falar de quase todos aqui eu acho que seja esse é um outro a gente tem o chain of responsability a gente tem o comente o intérprete ter o
interator mediator mental observe state street é o que a gente vai falar aqui o template method e o vitor como eu te falei provavelmente a gente vai falar de todos ou quase todos eu não tenho certeza ainda porque eu ainda não gravei todas as alças beleza mais dito isso é só para você saber que a gente tá saindo da categoria estilo e entrando na categoria comportamental aqui que seria errei já estão agora já que a gente já sabe o que que aconteceu aqui a gente vai falar sobre a intenção oficial do padrão de projeto strategy
aqui então o padrão de projeto street tem a intenção de definir uma família de algoritmos em capitular cada um deles e fazemos intercambiáveis o spotted permite que o algoritmo varie independente dos clientes que o utilizam o que é esse padrão de projeto ele visa separar nossa regra de negócio dos algoritmos dessa regra de negócio e aí a gente criaria uma família de algoritmos caso a gente precisa de variações desse algoritmo aqui deixa eu explicar dar um exemplo aqui da vida real para você entender melhor imagine que eu tenho por exemplo um e-commerce por causa ali
e eu tenho meu carrinho de compras do e-commerce nesse carrinho de compras é o local onde eu aplico as promoções dependendo de vários fatores por exemplo eu posso aplicar promoções para preço por causa que se o carrinho do cliente tiver mais de 100 reais eu posso aplicar uma promoção se eu posso aplicar também promoções para a quantidade de produtos dependendo da quantidade de produtos o carrinho eu posso aplicar um desconto no carrinho desse cliente eu posso dar frete grátis no carrinho de cliente dependendo também do valor ou da quantidade de produtos enfim e nesse caso
específico eu posso ter várias as ações de algoritmos dentro do meu carrinho de compras quando eu falar quando eu for obter o preço com desconto eu vou secar todas essas coisas então vou checar qual promoção que tem vigente na loja se essa promoção tá aplicada no carrinho e se o cliente está apto a receber essa promoção nesse caso se eu fosse fazer tudo isso dentro daquelas carrinhos em separar o algoritmo eu teria provavelmente vários ifs várias condicionais ali para checar isso né vou tirar kassyo valor do carrinho do cliente portanto eu vou dar tanto de
desconto se ou o cliente tem tantos produtos o carrinho vou dar tanto desculpa até assim por diante da para você ainda nem que isso aqui vai ser meio infinito né a partir do momento que o pessoal do bar que tinha lá fala eu quero fazer essa promoção você vai ter que ir lá e alterar a classe o carrinho e aí eu vou ter que fazer outra promoção você vai ter que ir lá e alterar a classe o carrinho então strategy ele tenta resolver isso separando o algoritmo como que é e se eu botei o carrinho
por causa aqui eu vou ter um campo no carrinho para linkar uma estratégia de desconto ea estratégia de desconto mas tem uma família inteira de estratégias então vou ter uma interface e falando olha eu tenho que uma this country pedir por exemplo uma interface que fala que eu tenho get discount um metro aí eu posso criar várias estratégias de desconto diferentes e posso simplesmente jogar essas estratégias esses objetos de algoritmo no campo de estratégia de desconto do carrinho então quando eu chamar get the discount no carrinho eu simplesmente amo a minha estratégia que eu tiver
configurado lá no carrinho e de dentro da estratégia ela se vira lá com o algoritmo beleza então é basicamente isso que a gente quer fazer separar o algoritmo da regra de negócio do nosso no nosso caso específico do nosso carrinho aqui beleza sobre os trade eles e para a regra de negócio de variar variações de algoritmos que possam existir como eu te falei nós vamos sempre usar o o exemplo do e-commerce só para você entender eu posso ter várias variações de promoções de desconto no caso então quando eu tenho essa família de vários algoritmos que
podem mudar ao longo do código eu posso utilizar o estou até de para isso ele define uma família de algoritmos cada um com uma variação diferente que eu acabei de falar a usa composição para permitir a troca de algoritmos em tempo de execução tão como a gente vai ter o carrinho que vai ter um campo lá para falar qual que é estratégia que ele tá usando eu posso em qualquer a qualquer momento do código trocar de estratégia tão simplesmente usa um setter por exemplo ou eu também posso injetar dependência no consultor no caso como eu
quiser e aí eu altero todo o algoritmo de desconto do carrinho de compras beleza como ele vai estar separado a gente usa essa injeção de dependência aqui no caso para gente trocar o algoritmo ele permite a criação de vários algoritmos sem a necessidade de é porque se você como eu te falei se você tivesse todas essas promoções dentro do carrinho provavelmente você ia tá fazendo isso tudo com if né se essa aí você precisar isso é cá todas as coisas né precisaria chegar quantos produtos no carrinho qual que é o valor total do carrinho se
a promoção é aplicável aí você não for você vai ter que passar para outra chegar aí e fazendo condicionais ali até você achar uma promoção que se encaixa ali no que o cliente está comprando beleza da basicamente isso que estratégia as striped desculpa faz é e eu acho que é por isso que ele é tão famoso porque a gente é involuntariamente mesmo que a gente não conheço esse padrão de projeto a gente tende a utilizar códigos similares a isso aqui beleza vamos dar uma olhada na estrutura dele e ele é bem simples aqui só que
ele é muito parecido com outros padrões ele é parecido com grids eu não me engano ele é parecido com state que a gente vai ver posteriormente o tecido com outros padrões então aqui o que a gente tá focando é no algoritmo carta em trocar o algoritmo aqui então quê que eu teria que tem um contexto qualquer coisa que você quiser e esse contexto precisa ter variações de algoritmos que eu preciso aplicar se eu tiver aqui dentro fazendo condicionais para aplicar um resultado final é para fazer um algoritmo diferente no caso aqui pode saber que nesse
caso especificamente é certo que eu posso utilizar os tomates de aqui então por exemplo isso aqui seria o nosso carrinho de compras nosso carrinho de compras teria um campo para ligar esses plated então ele vai fazer por agregação ou por composição ele vai usar o started aqui e aí só um adendo aqui rapidão quando a gente fala usa a composição um refrigerante essa por composição a gente tá falando tanto de agregação composição associação todo tipo de união que você tá fazendo que não é herança beleza então só para você saber e fala composição você pensa
tem que ser a composição e se não pode ser agregação também tanto faz beleza então nesse caso aqui umas contexto seria o carrinho de compra ele vai agregar aqui vou fazer a composição de uma estratégia qualquer essa estratégia que a interface de todos os algoritmos que eu botei no meu sistema então aqui eu poderia ter por exemplo discount is crafted então isso aqui só garante que todas as estratégias de desconto vão ter um método por exemplo get discount então voltei aqui get discount esse aqui também vai ter esse aqui vai ter quantos qualquer outro algoritmo
que eu for criar também vai ter esse método get caught aí aqui de dentro do carrinho quando eu chamar obter por exemplo preço total eu posso checar na estratégia se o desconto vai ser aplicado aqui e aí você vai ver isso aqui na prática como a gente vai ver que vai ficar interessante que ele vai delegar essa tarefa de realizar cheka gente todo o algoritmo ali é para estratégia beleza e é vamos dar uma olhada na aplicabilidade do street food aqui use os quartos de quando você tiver a variantes de um mesmo algoritmo e precisa
trocar esses algoritmos em tempo de execução então como eu te falei a gente tiver várias promoções é certo e e vários algoritmos dentro dessas promoções é certo que a gente precisa dos quatro de para gente fazer essas separar essa regra de negócio aqui no caso do nosso carrinho de compras você precisa isolar a regra de negócio do algoritmo que deve ser aplicado aplicando o princípio da responsabilidade única nesse caso específico aqui você só quer separar a regra do seu negócio do algoritmo dela beleza dá para você fazer os pratos de com ela aqui mas não
vai ficar meio sem sentido não com tanto sentido assim porque você em teoria só teria um algoritmo nesse caso estátua de seria uma complexidade a mais o seu código mas você estaria aplicando a responsabilidade é única e separando a regra de negócio do algoritmo beleza quando você perceber que está usando condicionais apenas para trocar o resultado final de um algoritmo então isso acontece às vezes gente está fazendo condicionais como te falei lá do caso do carrinho de compras a gente está fazendo condicionais para mudar o preço final do produto ali baseando-se no variações de algoritmos
então a gente pode separar todos esses algoritmos em várias estratégias diferentes aqui beleza o que que é bom e o que que é ruim no started a gente está trocando aqui herança por composição porque a gente poderia fazer novos carrinhos de compras aqui no caso para para para ter um desconto diferentes no caso poderia ser uma ideia mas não faz isso não que você não vai conseguir usar escolhe o quê que no caso que não vai ficar muito estranho eu acho que você tivesse 10 promoções você teria dessa não faz isso não vai digita trocando
aqui herança por conta e a gente separa a regra de negócio de algoritmos complexos então a gente aplica o princípio da responsabilidade única que no caso é e a gente precisa se aplica também o princípio do aberto e fechado aqui no caso porque é como eu te falei a gente pode ter vários algoritmos no nosso carrinho de compra como eu falei anteriormente então eu posso trocar esse algoritmo sem alterar nenhum algoritmo que o cliente realmente então posso pegar criar um novo algoritmo agora aqui e simplesmente falar lá no carrinho agora você vai usar esse é
o grifo aqui eu não preciso alterar nem o código do carrinho e nem a estratégia as estratégias que eu já queria entre ao rei anteriormente eu posso simplesmente ir lá no meu código cliente trocar a o algoritmo talvez uma ou duas linhas de código só beleza o que que é ruim pode ser muito complexo criar uma hierarquia de classes apenas para aplicar algoritmos isso aqui é o que eu quis dizer que no caso foi que o seguinte a usar funções está há muitas linguagens de programação permite que você passe funções para tudo que é lado
tá escrito já descritos permitem esse amo você pode não querer utilizar classes e simplesmente lança a funções como estratégias beleza para resolver o problema que daí nesse caso você não precisaria de todo me hierarquia de classe aqui beleza é outro outro ponto ruim é que é que o cliente vai precisar conhecer as estratégias todas elas no caso que você tiver 10 estratégias de desconto por exemplo o seu código cliente vai precisar conhecer todas essas estratégias para trocar ela quando for necessário beleza na próxima aula a gente vai aplicar esse padrão de projeto aqui na prática
aí eu deixei aqui escrito como foi o leite eu vou mudar isso aqui desculpa na próxima aula a gente vai implementar o strategy aqui na prática e aí a gente vai pôr a mão no código beleza então eu vou deixar essa aula aqui assim e eu te vejo na próxima um abraço