[MÚSICA] [MÚSICA] Olá a todos. Meu nome é Eduardo Guerra. Estamos de volta aqui com a segunda parte do vídeo aqui do hanzone do Builder e vamos apimentar pouco mais isto aqui. Eu vou vir aqui no meus testes, né. Eu tinha criado aqui o Excelentíssimo e o Magnífico, certo? Eu quero agora que tenha os dois. Como é que será que fica isto, heim? Excelentíssimo Magnífico Doutor, certo? Então eu vou chamar aqui Excelentíssimo, ponto, Magnífico, ponto gerar, certo? Então tem que ser aqui Magnífico Doutor. Bom aqui eu não precisei criar nada, a princípio, porque eu só usei métodos que já existem, mas quando eu rodar aqui ele não vai conseguir porque ele vai colocar só o Magnífico. Ele não colocou aqui o Excelentíssimo como deveria ser. O que eu vou fazer agora para ele rodar os dois? Eu vou criar aqui composite, né? Então New, Class, eu vou chamar aqui de Tratamento Composite. Ele vai ter aqui 'implements' Tratamento, okay? É, eu vou adicionar aqui os métodos que ele não tem, que é o tratar. E eu vou fazer o seguinte: eu vou ter aqui dentro dele igual o composite tem, que é Tratamento t1 e vou ter aqui Tratamento t2, certo? Vou criar aqui o meu construtor. Muito bom. [SEM SOM] E aqui eu vou, na hora que eu chamar o 'tratar', eu vou chamar aqui o t1, ponto tratar, mais o t2 ponto tratar. Bom, agora eu preciso colocar o composite lá, né? Não adianta criar só a classe aqui. Onde que eu vou fazer isto? Eu vou fazer aqui no meu Builder. Tá, então quando eu for botar o Excelentíssimo eu vou ver se o que tem lá, então eu vou fazer alguma uma coisa assim, se o gn, ponto, getTratamento ele for do Tratamento Null, do NullTratamento, na verdade, opa. Eita. NullTratamento, então eu vou colocar o Excelentíssimo ali. certo? Se não, então else, gn, ponto, setTratamento, aí eu vou colocar o composite, né. Então TratamentoComposite, é, eu vou colocar aqui o próprio tratamento que já está lá, gn, ponto, getTratamento, e o new Excelentíssimo. Okay, por que que não está, por que que ele está dando problema aqui? Vamos ver. 'get', ué, será que ficou com, vamos ver aqui como é que ficou. GeradorNome ih, eu vou colocar aqui, é que eu usei muito este nome Tratamento, né? 'getTratamentoStrategy'. Fazer assim. [SEM SOM] Vamos ver se agora, Tratamento, se agora vai dar certo. Já tinha aquele ali embaixo, né? Então vamos ver aqui, getTratamentoStrategy, é, agora deu certo. Está muito grande aqui, vou quebrar a linha aqui. Muito bom. Só que isto aqui eu vou ter que repetir ali embaixo, então eu vou extrair isto aqui para método. Vou vir aqui Refactor, Extract Method, eu vou colocar aqui 'inserir NovoTratamento'. Pode ser privado mesmo, método ali de dentro. Então só que aqui eu vou eu quero que este cara aqui seja passado como parâmetro. né? Então eu vou colocar aqui Tratamento, 't'. Então aqui ele vai receber o 't', ou aqui ele recebe o 't'. Muito bom. Aí aqui no Excelentíssimo vai ser assim e no Magnífico vai ser a mesma coisa, só que ao invés de Excelentíssimo aqui vai ser new Magnífico. [SEM SOM] Então note que eu usei composite como uma solução interna, daí eu vou passar este método privado aqui para o final. Eu usei o composite ali como uma solução interna, né, para resolver esta questão de poder rodar os dois ao mesmo tempo, certo? Então eu vou vir aqui no JUnit, será que roda agora? Vou rodar aqui. Opa. Maravilha. Bom, falta aqui que seria o proxy, né. O que a gente vai fazer aqui no proxy? Vamos ver o nosso teste aqui. Vou criar uma pessoa agora. Vou botar aqui pessoaDeJuizDeFora, é a minha cidade. Tá? Então criarPessoa, de Juiz de Fora, ponto gerar. Okay. Este método não tem. Quando eu mandar gerar ele vai colocar depois aqui do meu nome 'Eduardo de Juiz de Fora', certo? Então eu vou salvar aqui e este cara eu vou usar proxy para colocar este aí depois. Então eu vou criar o método aqui, o return vai ser sempre o 'return this', e este aqui vai ser 'local'. Vamos lá. Então eu vou criar aqui o proxy, este proxy ele tem que ter este GeradorNome aqui, né? Então eu vou vir aqui, New, Class. Então vai ser aqui o Gerador NomeProxyLocal. Ele vai implementar a super classe GeradorNome, certo? E eu vou pegar e vou pedir para ele, vou vir aqui, Source, vou gerar aqui Override/Implement Methods eu vou marcar todos aqui. Não, melhor, eu vou fazer diferente. Eu vou colocar aqui 'private', GeradorNome, gerador, certo? Eu vou vir aqui private, string, o local e aí no meu construtor eu vou receber os dois, né. Então, 'constructor' Está recebendo os dois ali e eu vou ver aqui, no source tem negócio bem bacana aqui que é o delegate methods. Então eu vou delegar aqui os métodos que são aqui do gerador para ele. Então o get, set Tratamento, o Tratamento Strategy e tal, eu vou dar override, mais aqui. Source, override implement mehods, faltou esse aqui. Eu vou chamar também o gerador, ponto, get Tratamento também. A única coisa que eu vou fazer aqui vai ser no próprio gerar model. Estou delegando tudo, para que eu estou encapsulando, menos o gerar nome que eu vou vir aqui e vou colocar assim, "de + local". Certo? Então, criei aqui o meu proxy que quando encapsula ele vai colocar o "de" e o local que eu vou configurar ali. Então eu vou vir no builder de novo. Quando eu colocar "de" algum lugar eu vou vir aqui e vou fazer gn é igual a new Gerador Nome Proxy Local. O gerador vai ser o próprio gn que já está lá e o local é o que eu receber ali como parâmetro. E ele retorna. Ele só vai estar encapsulando esse cara aí no proxy. Será que vai funcionar agora? Vamos rodar aqui. Funcionou. Cadê o meu teste? Está aqui. Vamos fazer agora teste bem bizarro aqui. Então eu copiei aqui o método de cima. Eu vou botar o magnífico Doutor Juiz De Fora De São José. Então vou modificar aqui, ao invés de criar a pessoa. Vai ser criar Doutor, vou colocar aqui magnifico vamos vamos colocar aqui, de("JuizDeFora").de("SaoJose"). Então aqui, vai ter que ser "Magnifico Doutor Eduardo de Juiz de Fora de São Jose". [SEM ÁUDIO] Ficou grande esse nome heim! Aqui eu estou misturando pouquinho de tudo. Será que ele vai funcionar? Roda aqui. Funcionou. Mas para a gente recapitular aqui, vamos ver a quantidade de coisas que a gente usou aqui. A gente usou aqui na classe Gerador Nome a gente usou nesse get Tratamento a gente usou a herança, Hook Method. A gente usou aqui no Tratamento a composição e aí a gente usou como se fosse strategy, a gente usou o composite para que eu possa combinar dois ou mais. A gente usou no object para ele poder, para eu colocar ali quando não tiver nada e a gente utilizou aqui o proxy, para poder colocar o "de" local. Então a gente usou bastante coisa. Se a gente olhar aqui para o nosso teste, ele só interage mesmo com o nosso builder. Então o builder ele é ótimo para você poder pegar essas estruturas e encapsular elas de forma que a pessoa não precise saber como que é o comportamento. Lógico que isso aqui é comportamento bem simples mas deu para ilustrar como que eu consigo compor uma estrutura complexa a partir do builder, encapsulando, trocar o que está compondo, criar a subclasse certa e etc. Então é isso. Certo? Espero que tenha ficado claro aí o builder, tenha dado também para dar uma recordada nos outros padrões. Então é isso. Muito obrigado, até o próximo vídeo. [MÚSICA] [MÚSICA]