Programação com Objectos/Teste de 2013/01/17

From Wiki**3

< Programação com Objectos

Parte 1

1.1. Considere o seguinte programa em Java:

public abstract class Animal {
  private String _name;
  protected Animal(String name) { _name = name; }
  public final void processFood(Food food) {
    eat(food);
    digest(food);
  }
  public void eat(Food food) { System.out.println(_name + " ate " + food); }
  public abstract void digest(Food food);
}

public class Cow extends Animal {
  public Cow(String name) { super(name); }
  public void digest(Food food) {
    System.out.println("Using chambers 1 and 2");
    System.out.println("Using chambers 3 and 4");
  }
}

public class Cat extends Animal {
  public Cat(String name) { super(name); }
  public void eat(Food food) {
    super.eat(food);
    System.out.println("Ate some fur!");
  }
  public void digest(Food food) {
    System.out.println("Using stomach on " + food);
    System.out.println("Expelling fur ball");
  }
}

public class Food {
  public String toString() { return "some food"; }
}

public class App {
  public static void main(String args[]) {
    Animal cow = new Cow("Daisy");
    Animal cat = new Cat("Puss");
    cow.processFood(new Food());
    cat.processFood(new Food());
  }
}

1.1.1. (0.75 val.) Qual o resultado que se obtém quando se executa o programa? (represente mudanças de linha com \n)

 Daisy ate some food
 Using chamber 1 and 2
 Using chamber 3 and 4
 Puss ate some food
 Ate some fur!
 Using stomach on some food
 Expelling fur ball

1.1.2. (0.25 val.) Que padrão de desenho é usado no programa?

Template Method (processFood using eat and digest)

1.1.3. (1.25 val.) Desenhe o diagrama de sequência UML correspondente à execução do programa, incluindo as etapas de criação dos objectos. O diagrama de sequência deve conter os nomes das mensagens trocadas (não é necessário representar os argumentos dessas mensagens nem as de retorno; represente todas as chamadas ao método println).

1.2. (2.25 val.) Considere o seguinte domínio:

Uma empresa de mobiliário produz vários tipos de móvel: peças individuais, tais como mesas, cadeiras, etc.; e conjuntos de peças relacionadas, tais como as que fazem parte da mobília de uma sala de jantar. Cada conjunto pode ser composto por peças individuais e/ou por subconjuntos (e.g., um conjunto de sofás pode fazer parte do mobiliário de uma sala de estar, juntamente com uma mesa). Todos os tipos de peça têm uma referência única no catálogo da empresa (cadeia de caracteres) e um preço, assim como um nome comercial.

Os clientes da empresa são identificados pelo nome (cadeia de caracteres) e possuem um número de telefone. Para cada cliente, a empresa mantém um registo das vendas realizadas.

Os clientes inicialmente não usufruem de descontos. No entanto, à medida que vão fazendo compras, o processo de fidelização vai introduzindo benefícios para clientes frequentes. Assim, para clientes que façam pelo menos cinco compras, o desconto passa para 30%; para clientes que façam pelo menos 100 compras, o desconto passa para 50%; se o cliente fizer mais do que 1000 compras, o desconto passa para 70%. Deve ser possível introduzir novas modalidades de recompensa e novas funcionalidades dependentes do escalão do cliente, sem grande impacto no código já existente.

A empresa permite obter impressões (System.out) das vendas, dos clientes (incluindo o nível de desconto a que tem direito) e do total de vendas. Cada venda é representada pelo nome da peça e pelo preço de venda final.

Implemente em Java todas as classes do domínio apresentado, bem como os seus atributos e métodos (excepto getters e setters). Os atributos identificados devem ser suficientes para suportar a funcionalidade e os métodos devem conter implementações que permitam verificar inequivocamente que a funcionalidade desejada está correcta (especialmente a que diz respeito às relações entre objectos).

Além da definição das classes de base do domínio, a ideia é utilizar os padrões Composite (para representar as peças) e State (para os descontos dos clientes).


1.3. (1.25 val.) O padrão de desenho Singleton garante que: (i) apenas um objecto de uma classe é criado por clientes, e (ii) a referência para a única instância da classe é sempre acessível a clientes. Descreva as duas principais funcionalidades do Java usadas para garantir este funcionamento. Esboce a estrutura do código deste padrão.


1.4. (1.25 val.)
TestePO12-20130117-14.png
Considere a hierarquia de herança na figura à direita. Cada pessoa disponibiliza o método act(), que encapsula o comportamento da actividade dessa pessoa. Pretende-se que seja possível registar o comportamento da actividade de cada uma das entidades. Deve ser possível ligar e desligar o rastreio de qualquer objecto da hierarquia em tempo de execução. Se o rastreio estiver activo, o sistema regista o início e o fim da actividade da pessoa. Que padrão de desenho usaria? Descreva como garantiria o funcionamento desejado?

Parte 2 (resposta múltipla)

2.1. Que padrão de desenho pode ser usado quando não é possível ou não é prático usar subclasses para adicionar funcionalidade, sendo usado para adicionar funcionalidade em tempo de execução?

  1. Composite
  2. Adapter
  3. Decorator
  4. Proxy
  5. Abstract Factory

2.2. Que par de padrões introduz um nível de indirecção entre a classe do cliente e a classe que este usa?

  1. Adapter e Decorator
  2. Proxy e Template Method
  3. Template Method e Strategy
  4. Decorator e Singleton
  5. Adapter e Composite

2.3. Que padrão de desenho tem como objectivo definir uma família de algoritmos e encapsular cada algoritmo como um objecto que pode ser permutado?

  1. Strategy
  2. Abstract Factory
  3. Visitor
  4. State
  5. Decorator

2.4. Que padrão de desenho usaria para dissociar uma abstracção da sua implementação, de modo que os dois possam variar de forma independente?

  1. Adapter
  2. Bridge
  3. Façade
  4. Composite
  5. Decorator

2.5. No modelo de mensagens Publicação-Subscrição, os assinantes registam-se num tema e são notificados quando novas mensagens chegam sobre esse tópico. Qual é, dos seguintes, o padrão que melhor descreve este modelo?

  1. Adapter
  2. Command
  3. Observer
  4. State
  5. Decorator