Tópicos de O.O. - Design Fest - Grupo M-2

Diagramas:

UML

Sequencia

Padrões Utilizados:

1. Singleton

O padrão Singleton serve para garantir que uma classe tenha somente uma instância e para fornecer um ponto global de acesso a essa instância. Esse padrão tem como participante único a classe a ser instanciada unicamente (Singleton). Os clientes obtém um objeto da classe Singleton solicitando-o à classe. Por sua vez, a classe Singleton faz o controle do número de instâncias e ao se solicitar uma instância a ela, se já existir uma, a classe retorna essa instância já existente; caso contrário, cria uma instância que será única para todo o sistema.

No sistema proposto, o padrão Singleton é aplicado em:
    •  ServidorDePartidas - Como toda Sessão criada tem de estar visível para todos os controladores de sessão é imprescindível que haja uma única instância da classe ServidorDePartidas tendo em vista que é essa classe que é responsável por "guardar", gerenciar e disponibilizar as sessões.

    Observação: Dada a tecnologia escolhida ( JAVA ) é interessante ressaltar que será necessário um método específico para a recuperação da instância. Isso é necessário pois a linguagem não permite o retorno da instância pelo construtor. Devemos ressaltar também que os construtores da classe devem ser privados para obter um funcionamento adequado do padrão.


2. Observer

O padrão Observer define uma relação de dependência "um-para-muitos" entre objetos, tal que quando há mudança no estado de um objeto, todos os seus dependentes são notificados e atualizados automaticamente. Esse padrão tem como elementos participantes o Subject, que define uma interface para adicionar/remover dependentes e notificar os dependentes; o ConcreteSubject, que retém o estado de interesse dos objetos ConcreteObserver e notifica esses objetos de sua mudança de estado; o Observer que define uma interface para atualizar os objetos que precisam ser notificados das mudanças no Subject e o ConcreteObserver, que implementa a interface de Observer e precisa atualizar o seu estado conforme o estado do Subject ao qual está associado.

No sistema proposto, o padrão Observer é aplicado em:
    •  ControladorDeJogo - É responsabilidade de cada Controlador de Jogo apresentar graficamente o estado atual do jogo. Para isso, o ControladorDeJogo atua como observador (ConcreteObserver) sobre a Sessão, sendo notificado de cada modificação no Estado.
    •  Sessao - A Sessao por sua vez, atua como o objeto observado (ConcreteSubject) notificando os objetos dependentes das mudanças no Estado.
    •  ControladorDeSessoes - O ControladorDeSessoes apresenta ao usuário todas as sessões disponíveis, para que o Controlador possa apresentar toda Sessao recentemente criada e deixe de apresentar aquelas que já terminaram, o controlador atua como observador sobre o ServidorDePartidas, sendo notificado de toda Sessao que é criada ou terminada.
    •  ServidorDePartidas - O ServidorDePartidas, assim como a Sessao, atua como objeto observado tendo como responsabilidade notificar cada ControladorDeSessoes quando uma sessao e criada ou terminada.

     Observação: Tendo em vista as constantes alterações no Estado devido a dinâmica do jogo, é interessante que cada ControladorDeJogo seja notificado uma única vez por ciclo, ou seja, permitir que a LogicaDoJogo atualize cada elemento para então notificar os Controladores.

3. Strategy

O padrão Strategy define uma familia de algoritmos intercambiáveis de forma que estes sejam independentes dos clientes que os utilizam. Esse padrão tem como elementos participantes o Context, que tem seu "comportamento" ou parte dele definido pelo algoritmo implementado pela Strategy referenciada; o Strategy, que define a interface comum para todos os algoritmos; o ConcreteStrategy, que implementa os algoritmos definidos pela interface Strategy.

No sistema proposto, o padrão Strategy é aplicado em:
    •  LogicaDoJogo - A LogicaDoJogo determina as regras que estão em vigor na sessão, ou seja determina a movimentação, colisão e destruição dos elementos, a quantidade de torpedos suportado por uma nave, as regras de pontuação e afins. Assim cada LogicaDoJogo, atuando como uma ConcreteStrategy, define um conjunto de algoritmos que reflete um modo de jogo para a sessão. Por exemplo, além do modo de jogo convencional, poderíamos ter um modo de Jogo em equipe, onde um jogador é penalizado se atingir um companheiro de equipe.
    •  Sessao - A Sessao atua como Context, tendo a dinâmica de jogo determinada pelas funções implementadas pela LogicaDoJogo associada.

4. Facade

O padrão Facade fornece uma interface unificada para um conjunto de interfaces em um subsistema. Ele define uma interface de nível mais alto que torna o subsistema mais fácil de ser usado por um cliente. Esse padrão tem como elementos participantes o Facade, que conhece as classes do subsistema às quais deve delegar solicitações dos clientes e, as classes do subsistema, que devem tratar as solicitações transmitidas pelo Facade.

No sistema proposto, o padrão Facade é aplicado em:
    •  Gerenciador - A Sessao fornece para o ControladorDeJogo uma interface de acesso indireto para outras classes como o Estado e a LógicaDeJogo.

5. MVC

O MVC ( Model - View - Controller ) ainda que não exatamente um padrão, é uma arquitetura para GUIs usada com freqüencia. O MVC consiste em dividir a interface ou pelo menos parte dela em três partes de forma que facilitem que o estado de um objeto possa ter varias e possivelmente diferentes apresentações. Essa arquitetura tem como elementos participantes o "model", que gerencia as informações e notifica as "views" quando as informações mudam. Ela contém os dados a serem apresentados e a funcionalidade associada aos mesmos; o "view", que é responsável por mapear os dados de um modelo em uma componente gráfica. A "view" é associada ao "model" e ela apresenta graficamente esse modelo na componente. Além disso, quando o modelo sofre uma modificação, a "view" automaticamente redesenha a apresentação para refletir essas mudanças; o "controller", que é a forma que o usuário interage com o "model".

No sistema proposto, o MVC é aplicado em:
    •  Sessao - A Sessao é um "model" que contém os estado de todos os seus elementos. Tais estados são transmitidos para cada ControladorDeJogo para que este atualize sua respectiva "view".
    •  ControladorDoJogo - O ControladorDeJogo é o "view" e o "controller" associado a uma Sessao.
    •  ServidorDePartidas - O ServidorDePartidas é um "model" que é responsável por disponibilizar e criar sessões para um ControladorDeSessoes.
    •  ControladorDeSessoes - O ControladorDeSessoes é o "view" e o "controller" associado ao ServidorDePartidas.



Diagramas de UML:

Cliente.
Servidor.


Diagramas de Sequencia :

Diagrama de sequencia de Desenho.
Diagrama de sequencia de Escolha de Sessão.
Diagrama de sequencia de jogo.
Diagrama de sequencia de mensagem.