Ybadoo - Soluções em Software Livre
Turmas
1º Semestre de 2015

Questão 01

Um padrão de projeto nomeia, abstrai e identifica os aspectos-chave de uma estrutura de projeto comum para torná-la útil para a criação de um projeto orientado a objetos reutilizável. Em relação a padrões de projeto, analise as afirmações a seguir.

  1. Prototype é um tipo de padrão estrutural.
  2. Singleton tem por objetivo garantir que uma classe tenha ao menos uma instância e fornecer um ponto global de acesso para ela.
  3. Template Method tem por objetivo definir o esqueleto de um algoritmo em uma operação, postergando a definição de alguns passos para as subclasses.
  4. Iterator fornece uma maneira de acessar sequencialmente os elementos de um objeto agregado sem expor sua representação subjacente.

É correto apenas o que se afirma em:

  1. I.
  2. II.
  3. I e IV.
  4. II e III.
  5. III e IV.

Questão 02

Aplicações gráficas, tais como editores de desenhos e sistemas de captura esquemática, permitem aos usuários construir diagramas complexos a partir de componentes simples. O usuário pode agrupar componentes para formar componentes maiores, os quais, por sua vez, podem ser agrupados para formar componentes ainda maiores. Uma implementação simples poderia definir classes para primitivas gráficas, tais como Texto e Linhas, além de outras classes que funcionam como recipientes (containers) para estas primitivas. Porém, há um problema com esta abordagem: o código que usa estas classes deve tratar objetos primitivos e objetos-recipientes de modo diferente, mesmo se na maior parte do tempo o usuário os trata de forma idêntica. Ter que distinguir entre estes objetos torna a aplicação mais complexa. Qual padrão de projeto descreve como usar a composição recursiva de maneira que os clientes não tenham que fazer esta distinção:

  1. Bridge - desacoplar uma abstração da sua implementação, de modo que as duas possam variar independentemente.
  2. Composite - compor objetos em estruturas de árvore para representarem hierarquias partes-todo.
  3. Decorator - agregar dinamicamente responsabilidades adicionais a um objeto.
  4. Façade - fornecer uma interface unificada para um conjunto de interfaces em um subsistema.
  5. Flyweight - usar compartilhamento para suportar eficientemente grandes quantidades de objetos de granularidade fina.
Um texto é constituído por palavras. Quando o texto é apresentado, através do método render, cada palavra pode aparecer sem qualquer modificação de aspecto (utiliza-se o método render correspondente). É ainda possível modificar dinamicamente o aspecto das palavras, permitindo que sejam apresentadas em negrito, itálico e sublinhado, ou ainda em combinações variadas, como por exemplo, negrito e itálico ou itálico sublinhado. No entanto, a apresentação é sempre realizada da mesma forma, através do método render.
  1. Qual o padrão de projeto mais adequado para ser usado no desenvolvimento deste sistema?
  2. Apresente o diagrama de classes em UML da solução proposta.
  3. Apresente a codificação na linguagem de programação Java da solução proposta.

Questão 04

Considere um recurso de ajuda (help) sensível ao contexto para uma interface gráfica de usuário. O usuário pode obter informação de ajuda em qualquer parte da interface simplesmente pressionando o botão do mouse sobre ela. A ajuda que é fornecida depende da parte da interface que é selecionada e do seu contexto; por exemplo, um botão widget numa caixa de diálogo pode ter uma informação diferente de ajuda de um botão similar na janela principal. Se não houver uma informação específica de ajuda para aquela parte da interface, então o sistema de ajuda deveria exibir uma mensagem de ajuda mais genérica sobre o contexto imediato - por exemplo, a caixa de diálogo como um todo. Daí ser natural organizar a informação de ajuda de acordo com a sua generalidade - do mais específico para o mais genérico. Além do mais, está claro que uma solicitação de ajuda é tratada por um entre vários objetos da interface do usuário; qual objeto depende do contexto e de quão específica é a ajuda disponível. O problema aqui é que o objeto que na prática fornece a ajuda não é conhecido explicitamente pelo objeto (por exemplo, o botão) que inicia a solicitação de ajuda. O que necessitamos é uma maneira de desacoplar o botão que inicia a solicitação de ajuda dos objetos que podem fornecer a informação de ajuda. Qual padrão de projeto define como isso acontece:

  1. Command - encapsular uma solicitação como um objeto, desta forma permitindo parametrizar clientes com diferentes solicitações, enfileirar ou fazer o registro (log) de solicitações e suportar operações que podem ser desfeitas.
  2. Mediator - definir um objeto que encapsula a forma como um conjunto de objetos interage, promovendo o acoplamento fraco ao evitar que os objetos se refiram uns aos outros explicitamente e permitindo variar suas interações independentemente.
  3. Chain of responsibility - evitar o acoplamento do remetente de uma solicitação ao seu receptor, ao dar a mais de um objeto a oportunidade de tratar a solicitação, encadeando os objetos receptores, passando a solicitação ao longo da cadeia até que um objeto a trate.
  4. Observer - definir uma dependência um-para-muitos entre objetos, de maneira que quando um objeto muda de estado todos os seus dependentes são notificados e atualizados automaticamente.
  5. State - permite a um objeto alterar seu comportamento quando o seu estado interno muda, parecendo que o objeto alterou sua classe.

Questão Extra

Padrões de criação (creational patterns) abstraem a forma como objetos são criados, tornando o sistema independente da forma como os objetos são criados, compostos e representados. Um padrão de criação de classe usa a herança para variar a classe que é instanciada, enquanto que um padrão de criação de objeto delegará a instanciação para outro objeto. Há dois temas recorrentes nesses padrões. Primeiro, todos encapsulam conhecimento sobre quais classes concretas são usadas pelo sistema. Segundo, ocultam o modo como essas classes são criadas e montadas. Tudo que o sistema sabe no geral sobre os objetos é que suas classes são definidas por classes abstratas. Os padrões de criação são classificados em Abstract Factory, Builder, Factory Method, Prototype e Singleton. O padrão Abstract Factory é usado quando:

  1. o sistema deve ser independente da maneira como seus produtos são criados, relacionados e representados.
  2. o algoritmo de criação de um objeto deve ser independente das suas partes e da maneira como ele é montado.
  3. houver uma única instância de uma classe e esta for acessada a partir de um ponto de acesso conhecido.
  4. classes delegam responsabilidade a alguma das subclasses, e deseja-se localizar qual é a subclasse acessada.
  5. as classes utilizadas para instanciação são especificadas em tempo de execução ou carregadas dinamicamente.