GoF - Desenho2018-1/pan-pan GitHub Wiki
Histórico de edição
Autor | Data |
---|---|
Fabíola Fleury | 26/04 |
Pablo Diego | 30/04 |
Pablo Diego | 03/05 |
Pablo Diego | 04/05 |
Fabíola Fleury | 13/05 |
Josué Nascimento | 13/05 |
Álax Alves | 13/05 |
Introdução
Dentro de um projeto, é necessária a criação de uma solução específica para o problema, mas também genérica o suficiente para abarcar problemas e requisitos futuros. Os padrões de projeto GoF (Gang of Four) nomeiam, explicam e avaliam aspectos de projetos importantes e recorrentes em sistemas orientados à objeto.
Este documento trata os padrões do grupo GoF que são implementados no sistema Pan Pan! Cada um está listado e possui sua especificação a seguir.
Composite
Este padrão é utilizado para estruturação de dados que possuam hierarquia parte-todo, assim permitindo que os clientes tratem da mesma forma objetos individuais e composições de objetos.
Estrutura genérica do padrão
Implementação no Projeto Pan Pan!
No nosso contexto, temos a classe música e uma música pode ser um medley, isto é, várias músicas combinadas em uma só, que serão tocadas de maneira encadeada em um show, sem mudança da harmonia entre as "submúsicas" que compõe o medley.
Observer
O Observer define uma dependência entre objetos de modo que quando um objeto muda o estado, todos seus dependentes são notificados e atualizados automaticamente. Permite que objetos interessados sejam avisados da mudança de estado ou outros eventos ocorrendo num outro objeto.
Estrutura genérica do padrão
https://raw.githubusercontent.com/wiki/Desenho2018-1/pan-pan/images/observer.png
Implementação no Projeto Pan Pan!
Para a implementação das notificações em relação a atividade de uma banda, foi utilizado o padrão Observer entre os membros(Observers) e banda (Observable) que estejam interessados em receber as notificações das atividades executadas dentro da banda. https://raw.githubusercontent.com/wiki/Desenho2018-1/pan-pan/images/observerPanpan.png Como pode ser visto no código apresentado, uma pequena adaptação foi necessária no retorno das funções de notify e de update pela forma como o framework Spring trabalha. A criação de uma notificação acontece durante um evento que é recebido na BandRepository, uma ação lá gera uma nova instância de Notification e é repassada para a banda notificar seus membros, porém, é necessário o retorno das notificações clonadas pelo usuário para serem salvas no banco, pois o acesso ao mesmo só é feito através das classes de Repository, EventHandler ou Controllers, não sendo acessivel na camada de Model.
Prototype
É um padrão criacional que permite a criação de novos objetos a partir de um modelo original ou chamado protótipo, que é clonado. Utilizado quando a tarefa de criação de uma instância é muito árdua ou é necessário muitos objetos com poucas diferenças entre eles na aplicação.
Estrutura genérica do padrão
https://raw.githubusercontent.com/wiki/Desenho2018-1/pan-pan/images/prototype.png
Implementação no Projeto Pan Pan!
As notificações do sistema são criadas pela banda de acordo com a sua atividade, porém, para manter um estado de visualização individual de cada membro da banda durante a utilização da página, é necessario o armazenamento de notificações por usuário. Dessa forma, a notificação original criada pela banda é clonada para todos os usuários interessados nas notificações e salvos no banco. https://raw.githubusercontent.com/wiki/Desenho2018-1/pan-pan/images/prototypePanPan.png Como pode ser visto na anotação de código do diagrama, a notificação que o usuário recebe é clonada, é definido o novo owner desta notificação como o user atual, e a mesma é adicinada a lista de notificações e o clone é retornado para ser salvo no banco.
Facade
É um padrão que fornece uma interface unificada para um conjunto de classes de um subsistema tornando o sistema mais fácil de ser utilizado
Estrutura genérica do padrão
https://raw.githubusercontent.com/wiki/Desenho2018-1/pan-pan/images/padraoFacade.png
Implementação no Projeto Pan Pan!
No projeto pan-pan para ser possível adicionar um membro em uma banda é necessário utilizarmos a busca do membro e após encontrá-lo, salvar na camada de persistência os métodos necessários para realizar tal tarefa, se o encontram na BandRepository e na classe User, a classe AddMemberController dispõe apenas de uma fachada para a integração desses pontos.
https://raw.githubusercontent.com/wiki/Desenho2018-1/pan-pan/images/facadeDiagrama.png
Referências
Gamma, E. (2009). Padrões de Projetos: Soluções Reutilizáveis. Bookman editora.