Pessoal,
Está disponível no link a seguir uma lista de exercícios sobre padrões de projeto. Acrescentei nessa lista mais uma questão.
http://www.4shared.com/document/nf9Dv12r/Lista_Padrao_Projeto.html
A seguir segue o conteúdo da mesma:
1. Uma boa prática no desenvolvimento de aplicações é o registro de exceções, de informações de controle ou de segurança nas aplicações. Chamamos isso de Log da aplicação. Uma aplicação não precisa ter mais do que uma classe gerando e registrando as informações do log. Nesse contexto, o padrão de projeto Singleton pode ser implementado. Portanto, aplique esse padrão nas classes apresentadas a seguir. A classe Logger usa a variável ativo para indicar se as informações podem ser exibidas, enquanto que a classe Aplicacao é a classe que utiliza dois objetos de tipo Logger. A classe Windows é a principal.
public class Logger {
/* por default não imprime o log */
private boolean ativo = false;
public Logger() {}
public boolean isAtivo() {
return this.ativo;
}
public void setAtivo(boolean b) {
this.ativo = b;
}
public void log(String s) {
if(this.ativo)
System.out.println("LOG :: " + s);
}
}
Agora a classe Aplicacao:
public class Aplicacao {
public static void main(String[] args) {
Logger log1 = new Logger();
log1.setAtivo(true);
log1.log("PRIMEIRA MENSAGEM DE LOG");
Logger log2 = new Logger();
log2.log("SEGUNDA MENSAGEM DE LOG");
}
}
Resultado da aplicação antes de aplicar o padrão:
PRIMEIRA MENSAGEM DE LOG
Ao aplicar o padrão, a classe aplicação deverá utilizar o mesmo objeto do tipo Logger nas duas chamadas ao método log, portanto o resultado da aplicação será:
PRIMEIRA MENSAGEM DE LOG
SEGUNDA MENSAGEM DE LOG
Passo 1: Torne o construtor de Logger privado;
Passo 2: Crie uma variável estática logger para conter uma referência única ao objeto de Logger; instancie a variável com null;
Passo 3: Crie um método estático getInstance. Se não existir uma referencia em logger crie uma instancia de Logger e atribuia a logger, em seguida retorne logger; se existe retornar a referência para logger.
Passo 4: Na classe Aplicacao, substitua todos os “new Logger()” pelo uso do método estático getInstance criado no passo 3;
Passo 5: Teste o código.
2. Considere que sua aplicação agora vai precisar especializar o comportamento de Logger. Teremos agora as classes: LoggerEventViewer – que registra os eventos no EventViewer; LoggerFile – que registra o evento em arquivo de sistema ou LoggerDatabase – que registra o evento em um banco de dados. Considere que a aplicação pode escolher qualquer uma dessas formas de registro de log. Mostre como esse problema pode ser resolvido utilizando o padrão de projeto Strategy. Utilize as classes: Logger e Aplicacao da questão anterior.
3. Você foi contratado por uma empresa que desenvolve aplicações para edição e manipulação de imagens. Seu chefe apresentou para você as seguintes classes:
public class Visualizador{
public void Visualizar(){
Imagem img = nem Imagem();
img.carregar();
img.exibir();
img.fechar();
}
}
public class Imagem{
public void carregar() {
System.out.println("Imagem BMP:");
System.out.println("Carregando imagem BMP...");
System.out.print("...");
System.out.print("...");
System.out.print("");
}
public void exibir() {
System.out.println("Exibindo imagem por 20 segundos.");
}
public void fechar() {
System.out.println("Fechando imagem.");
}
}
Essas classes são responsáveis por carregar imagens do tipo BMP. Seu chefe mandou que você alterasse o código de forma que a criação de novos visualizadores de imagem ficasse mais flexível. Crie as seguintes classes: VisualizadorJPG – que visualiza imagens do tipo JPG e ImagemJPG – que trata de imagens JPG. O código deve ser desenvolvido de forma que a criação de qualquer outro visualizador seja rápida e flexível. Para resolver esse problema altere o código acima usando o padrão Factory Method.
4. Na biblioteca existe a lista de espera de determinado livro. Existe uma única lista de espera para cada livro e quando o livro retorna para a biblioteca os alunos inscritos na lista recebem a notificação de que o livro está disponível. Faça o modelo de classe, somente com os métodos mais importantes, do contexto apresentado, considerando que os padrões de projeto Singleton e Observer serão utilizados na solução.