[MÚSICA] [MÚSICA] Olá a todos! Meu nome é Eduardo Guerra e estamos aqui no curso de Padrões, e hoje vamos mostrar o padrão "Observer" Bom, a ideia, enquanto eu vou explicando eu já vou criando aqui o primeiro teste de unidade, a nossa classe alvo aqui de desvio padrão seria uma classe que a gente vai chamar de "Quebrador String". Mas a gente vai começar como sempre aqui pelo teste, Teste "Quebrador String", Ele vai pedir para eu colocar o "JUnit" ali,ok. E então, é uma classe que simplesmente pega uma frase e quebra as palavras. Vamos chamar ao invés de "Quebrador String", vamos chamar de "Quebrador Palavras", acho que é melhor. Os nomes são importantes. Certo? Então, "Quebrador de Palavras" Então vamos criar. A ideia é ser uma classe que ela quebra uma frase palavras, e aí depois a gente quer que esse quebrador, ele possa contar uma frase palavras, quantas palavras têm por diferentes critérios, por exemplo, quantas palavras começam com letra maiúscula, quantas palavras têm uma quantidade par de caracteres, então ele poderia, quando ele quebra, ele vai ter essa funcionalidade de estar contando a palavra por esses diferentes critérios. Então, eu vou vir aqui, eu vou criar uma "String", frase, vou botar aqui "O rato roeu a roupa do rei". Certo? E aí eu vou vir aqui, vou chamar aqui o meu, vou criar o meu "Quebrador Palavras", "Quebrador Palavras" Certo? Opa! Igual a mil. "Quebrador Palavras". Se você falar: "Que classe é essa aí que eu nunca ouvi falar?" Então não existe ainda, né?! É mas a gente está fazendo o TDD aqui. Então, eu vou vir aqui, botei aqui "Palavra" igual a "Quebrador" ponto quebrar. Então ali eu vou ter que ter como contar: Uma, duas, três, quatro, cinco, seis, sete. Então eu vou fazer aqui "AssertEqual". "Sete" igual à "Palavras" ponto "Length". Ok. Vamos salvar aqui, primeiro eu tenho que criar esse "Quebrador Palavras". Cria a classe, vou criar lá no meu "Source", vou criar aqui o meu teste. Criou ali o meu "Quebrador de Palavras". Bom, tem que criar agora esse "Quebrar" aqui. Opa! Faltou passar a frase aqui, vamos apagar isto. Agora sim. Salvo aqui. Eu vou criar o método "Quebrar",né?! A princípio, vou dar simplesmente "Split" aqui. Frase ponto "Split", por espaço e ele vai quebrar. Lembrando que nosso exemplo aqui é para ilustrar mesmo o uso do padrão. Criou ali! Vamos rodar aqui nosso teste. Opa! "Run As" Ok. Bom, como é que eu quero aqui agora? Eu quero, por exemplo, poder chegar aqui no meu, vou botar aqui, contador simples, certo?! Eu vou vir aqui no meu "Quebrador" e vou fazer o seguinte. "Quebrador" ponto, adiciona contador. E aí eu vou vir aqui e vou chamar aqui de Simples, certo? E vou dar "new" contador simples, ok? Então eu adiciono ali cara, aquele cara ali vai ser "Observer", ele vai observar as palavras e vai contar aquelas que ele achar adequedas. Então eu vou vir aqui, vou ali no meu "Quebrador", Opa! "Quebrador". E vou vir aqui, vou chamar o "Get Contagem". Qual contagem que eu quero? Aquela simples ali. E aí ele tem que me retornar sete, é isso que eu quero que ele faça. Então eu vou salvar aqui, lógico não existe nada disso ainda,né?! Eu vou criar aqui, "Contador Simples", vou criar lá no "Source", certo?! Eu já vou dizer que ele vai ter que implementar "Contador Palavras". Opa! Aí sim. Esse também não existe, eu vou criar também. Tudo bem. Para quê que eu fiz isso? Para poder já acertar aqui a interface. Tem que criar agora esse "Adiciona Contador", vamos criar esse método aqui, só que ao invés dele receber, ai eu vou chamar aqui "nome do contador", e ele vai receber "Contador Palavras". Muito bem. Ele está adicionando aquele tipo ali de contador, e aqui no "Get Contagem", está aqui o método, ele vai subir aqui o nome e vai retornar inteiro. No caso aqui eu vou retornar zero só para ele não dar pau. Ok, muito bom! Perfeito! Então agora, eu já consigo rodar o teste, né?! Certo? Ele vai dar errado, porque ele está retornando o zero ali. E vamos implementar aqui o nosso "Quebrador de Palavras", a primeira coisa, então, no "Observer". Aqui é como se fosse aquele método tradicional "Observer". Aqui é pouquinho diferente porque eu vou criar mapa, porque eu estou criando pelo nome. Então, eu estou criando "Map" de "String" por "Contador Palavras", né?! É, contadores, aqui eu vou criar "new" "Hashmap" aqui. Opa! Bom demais! Então quando eu vi aqui, vou mandar adicionar, certo? Eu preciso é... quando eu mandar adicionar, eu preciso adicionar ali nos meus contadores,né!? Contadores, ponto, "Put", o nome e o contador. Legal, legal! Bom, agora, eu tenho que pegar contagens. Bom, quem vai saber essa contagem? O contador,né?! Então eu vou vir aqui, vou pegar ali o contadores, ponto, "get", o nome, ponto, é... "Get Contagem", uma só contagem. Esse método não existe ainda. E aquela coisa também, para eu poder contar, eu preciso, antes, passar as coisas para ele,né?! Então eu vou vir aqui, nesse "Frase" ponto "Split ali, vou extrair aqui uma variável local, "Palavras", muito bem! Eu preciso mandar os computadores contarem. Então eu vou fazer 'for' aqui. Para cada 'String' nas 'palavras', opa, para cada 'palavra' na 'palavras', [SEM_ÁUDIO] eu vou mandar os computadores contarem. Eu vou vir aqui 'Contador Palavras' e nos 'Contadores' "ponto" os valores. Então eu vou vir ali olha, 'c.contar', aquela 'palavra'. Certo?! Bom, se eu olhar aqui, o meu 'contador.palavras' não tem nenhum desses dois métodos, então a gente cria aqui, manda adicionar lá. Criar método, muito bem, salva. E eu preciso que meu contador simples tenha esses métodos. Então eu vou criar aqui 'Private' 'int qtd', a quantidade de palavras. Quando eu mandar contar, no caso aqui ele vai contar todas. Então ele vai somar, 'qtd.++', no caso. E a minha contagem vai retornar aquela quantidade ali. Rodou, olha, passou no teste. Agora, você fala assim: "Nossa, mas isso daí foi bem simples, você fez praticamente o que tinha ali". Mas eu criei toda essa estrutura. Olha, você nem precisa desse palavras aqui mais. Eu criei toda essa estrutura para poder criar os próximos contadores. Então, olha, eu vou vir aqui olha, vou adicionar o meu contador aqui. 'MAIÚSCULA'. E vou adicionar aqui o 'Contador' 'Maiúscula'. Bem, então aqui olha, vamos ver qual vai ser o meu teste. O rato e o rei eu vou colocar com o R maiúsculo. E aí a minha contagem aqui vai ser dois. Olha como eu já tenho toda a minha estrutura agora do meu observer aqui dentro do quebrador. Então note que aqui cada contador de palavra é como se estivesse observando cada palavra que ele quebrou ali. Então quando eu mando ele contar, na verdade eu estou observando. Às vezes a gente usa o padrão. Não tem que usar o nome daquelas que a gente usa ali. E aqui olha, no meu observer, cada está me dando uma resposta diferente. Então eu vou vir aqui. Cliquei. Vou criar a minha classe 'Contador Maiúscula' aqui dentro do Source. Olha lá, ele já sabe que é 'Contador Palavras'. Bom, aqui eu preciso implementar ele agora. Então eu vou verificar aqui se a palavra começa com maiúscula. Então vamos lá: " 'if' palavra 'ponto get' 'charAt' na posição zero, que é a primeira, eu acho que tem 'character' ponto 'isUppercase', 'isUpperCase' estou pegando o zero e vendo se é 'Upper Case'. Se for eu vou somar aqui, olha: " 'qtd++'" Vamos criar outro aqui. Eu vou... 'contador' 'LetrasPares'... Então, eu vou criar aqui 'pares', e vou criar aqui o meu 'contador pares'. [SEM_ÁUDIO] Ele vai contar quantas palavras com quantidade de letras pares que tem. No caso aqui ele tem o rato, uma, duas, e três. Então vamos lá. Mesma coisa. Olha como é fácil adicionar vários contadores aqui depois que eu criei aquela estrutura do observer. Então vamos criar aqui dentro do source. É a mesma coisa. A gente fixa nossa variável, para contar aqui. Eu vou ver, olha, no caso eu vou pegar aqui. Se a 'palavra' 'ponto length'. A gente pega o resto por tempo. Então se o resto da divisão por dois for igual a zero, ou seja, é uma forma de ver se ela é par. 'qtd++' E aí ele retorna ali a quantidade. [SEM_ÁUDIO] Vamos rodar aqui o nosso teste. Opa! Olha lá, o quatro passando ali. Vamos só para desencargo de consciência, vamos fazer o teste com todos ao mesmo tempo, para ver se ele está contando todo mundo ali. Colocar aqui, 'Contador Integrado'. [SEM_ÁUDIO] Eu vou usar essa frase mesmo, mas eu vou estar adicionando todos ali. Vou adicionar aqui maiúscula. Vou adicionar ali o simples. [SEM_ÁUDIO] Será que funciona com vários contadores ao mesmo tempo? É o que a gente vai ver agora, né?! Coloco aqui maiúscula, coloco aqui simples. Eu poderia até usar uma outra frase, mas vamos rodar com essa aqui mesmo. Rodou. Olha, funcionou. Então a gente viu que a gente usou aqui o conceito do observer, tendo que a gente teria a adição dos observadores da diferença. Lembra que eu comentei para vocês que o padrão nem sempre é exatamente da mesma forma. No caso aqui, eu criei o meu observer pouco diferente para se adaptar a minhas necessidades. No caso aqui, os contadores observam, mas eles também vão contar ali as palavras e vão gerar resultado que é o que eu vou pegar aqui nesse guia de contagem a partir do nome que eu dei para ele. Certo? Então eu espero que tenha ficado claro como o observer pode dar essa flexibilidade para a gente. Muito obrigado. Continue assistindo o curso. [MÚSICA] [MÚSICA]