Vamos aprender então para que serve o padrão de projeto mediator e como ele funciona. O mediator é padrão comportamental e o objetivo dele é definir objeto que encapsula como outros objetos interagem entre si. Então dentro do mediator fica o conhecimento sobre como é a interação entre vários objetos. E a vantagem dele, é que ele promove o baixo acoplamento entre esses outros objetos evitando que esses objetos refiram-se diretamente uns aos outros. E dessa forma ele permite a gente alterar essa interação independentemente dos objetos. Vamos ver exemplo. Eu vou pegar exemplo de amigo meu, Joe Yoder, que é grande desenvolvedor de software e consultor desenvolvimento de software, quem quiser ver mais sobre o trabalho dele pode visitar o site "joeyoder.com". E o exemplo que o Joe dá é escritório de apólices de seguros, é escritório que vende apólices de seguros. Nesse escritório há procedimento para aprovação de novas apólices que envolvem o histórico do cliente, quando você vende seguro para o cliente você tem que olhar o histórico, por exemplo o histórico de crédito daquele cliente. Você vai ter corretor de seguros, que é quem faz a venda e eventualmente ali vai aprovar essa venda, executar a venda. E você tem também outro objeto para representar o conteúdo da apólice, quais são as regras daquela apólice de seguros. Então se você não usa o mediator você vai ter três objetos, três classes para representar essas três coisas, a apólice de seguros, o corretor de seguros e o histórico do cliente e essas três classes vão ter que interagir entre si. Uma vai consultar a outra, uma vai chamar metas para outra. Então você tem aqui todo mundo conhecendo todo mundo, todo mundo tendo que interagir com todo mundo, todas as classes acopladas a todas as outras classes. Então é sistema com grande acoplamento, que a gente viu que causa muitos problemas, porque toda vez que a gente mexer uma classe a gente vai ter que mexer nas outras ali invariavelmente. Ou à s vezes, quando a gente conserta bug uma classe começa a aparecer outros bugs outras classes. Para resolver esse problema do autoacoplamento, o que a gente pode fazer é introduzir novo objeto aqui que a gente vai chamar de mediator, que vai intermediar a relação entre esses outros objetos. Então com o padrão mediator ficaria dessa forma, a gente introduziria esse novo objeto, no caso se chama de procedimento, que ele encapsularia qual é o procedimento de venda de uma apólice de seguros e esse procedimento, aà sim, ia consultar o histórico do cliente, o corretor de seguros ia interagir com isso e ia gerar essa nova apólice de seguros, Então no padrão mediator esse objeto central é chamado de mediator e os outros são chamados de colegas. Então a vantagem aqui é que, note que aqui cada objeto estava acoplado a todos os outros, já nessa nova figura com o mediator cada objeto é acoplado só no mediator. E dependendo do jeito que você implementa essa flecha pode ser só no sentido do mediator para o objeto de fora. Às vezes, esses objetos de fora podem se tornar completamente independentes, completamente desacoplados de tudo e o mediator é quem vai chamando ali esses vários objetos. Então todos os objetos ficam completamente desacoplados do resto do sistema e podem ser reutilizados, podem evoluir independentemente. Por outro lado, o mediator é objeto que acaba sendo acoplado a todo mundo. Então outra coisa boa ali do mediator é que ele ajuda a separar o sistema no que a gente chama de processos de negócio e objetos do domÃnio. Então desenhando a mesma figura anterior, só que com o mediator cima e com os outros objetos baixo, a gente tem essa separação. Então aqui embaixo a gente tem os objetos de domÃnio que representam as coisas daquele meu domÃnio, nesse caso do domÃnio de venda de apólices de seguro e cima ficam as regras de negócio. Vamos pensar num outro domÃnio, por exemplo, domÃnio médico de sistema que controla hospital. Você poderia ter aqui embaixo objetos representando os pacientes, o histórico de saúde dos pacientes, os médicos, os enfermeiros, os exames clÃnicos, os equipamentos que existem no hospital, numa UTI, por exemplo. Então esses aqui serão os objetos do domÃnio. E aqui cima as regras de negócio. Então por exemplo, qual é a regra de admissão de paciente no hospital. Então ele chega no hospital, a gente tem que coletar dados pessoais, a gente tem que associar ele a médico e a enfermeiro, a gente tem que pegar quarto no hospital. Então essas regras de negócio vão interagir com os objetos do domÃnio, criar instâncias dos objetos de domÃnio e eu posso ter diferentes regras para diferentes coisas. Uma regra para admissão no hospital. Eu posso ter uma outra regra que representa dado que eu identifiquei uma doença no paciente, qual é o protocolo que eu devo seguir. E quando a gente tem sistema desse tipo, normalmente esses objetos de domÃnio é uma coisa que não varia muito. Você pode passar vários anos sem mudar essa parte do sistema dos objetos do domÃnio. Então todo hospital vai ter paciente, médico, enfermeiro, vai ter isso para sempre. Daqui a 30 anos vai continuar tendo esses mesmos três objetos e coisas do gênero. Já os procedimentos, as regras de negócio, podem mudar rapidamente. Então toda vez que aparece novo artigo cientÃfico explicando como tratar uma determinada doença, você pode criar novo protocolo aqui cima que vai mudar a forma como você trata aquela doença e isso pode mudar rapidamente de mês para outro, ou todo mês você mudar os protocolos aqui cima, mas os objetos de domÃnio raramente você vai mudar. Talvez, por exemplo, quando alguém inventa novo exame clÃnico, aà sim você acrescenta novo objeto de domÃnio. Ou quando alguém inventa novo equipamento médico você cria novo objeto domÃnio, mas é uma coisa rara, vai acontecer uma vez por ano, já que as regras de negócio podem mudar eventualmente todo dia. Então é jeito de você controlar melhor ali as coisas do seu domÃnio e os procedimentos que lidam com as coisas do domÃnio e as coisas que mudam muito e as coisas que mudam mais vagarosamente. Então esse é o padrão mediator. Formato geral é esse que você vai ter mediador aqui no meio e esse mediador vai intermediar a relação de vários, três, quatro, cinco, seis, sete colegas aqui, que são esses objetos isolados. E os objetos eles são altamente desacoplados, já o mediador é totalmente acoplado ao resto. Então resumindo, padrão mediator define o objeto que encapsula dentro de si o modo como conjunto de objetos interage. Ele promove o baixo acoplamento, fazendo com que os objetos não interajam entre si diretamente. Por outro lado, o mediator se torna a parte não reutilizável, mas todo o resto fica reutilizável. Então você não vai reutilizar o mediator diferentes contextos, quase nunca você vai fazer isso, mas os objetos que ele está mediando, aà sim, eles se tornam bem reutilizáveis e podem ser utilizados diferentes contextos. Então é isso. Eu espero que vocês tenham aprendido o mediator.