- Compreender o design pattern Strategy e suas vantagens.
- Projetar interfaces e classes concretas que encapsulam diferentes estratégias de cálculo de média.
- Aplicar o princípio Open/Closed (aberto para extensão, fechado para modificação).
- Consolidar boas práticas de programação orientada a objetos em Java.
O coordenador do curso deseja unificar a forma de calcular a média final das disciplinas, mas diferentes métodos podem ser adotados conforme a ementa:
- Média aritmética – aprovado se
média ≥ 5,0 - Média geométrica – aprovado se
média ≥ 7,0
Você deve isolar esses comportamentos em classes independentes e permitir que a disciplina escolha a estratégia em tempo de execução.
- A aplicação deve ser executada em modo console.
- Interfaces devem ser usadas para definir o contrato das estratégias.
- O programa não deve conter regras “se/então” (
if) para decidir qual fórmula aplicar; a decisão ocorre via injeção da estratégia. - A saída deve exibir:
P1,P2,MédiaeSituação (Aprovado/Reprovado)conforme exemplo.
| Passo | Descrição |
|---|---|
| 1 | Crie a interface MediaStrategy com dois métodos:double calcularMedia(double p1, double p2);String verificarSituacao(double media); |
| 2 | Implemente a classe concreta Aritmetica que realiza:média = (p1 + p2) / 2 e aprova se média ≥ 5.0. |
| 3 | Implemente a classe concreta Geometrica que realiza:média = √(p1 × p2) e aprova se média ≥ 7.0. |
| 4 | Crie a classe Disciplina contendo nome, notas (p1, p2), média e situação. Ela recebe um objeto MediaStrategy no construtor. |
| 5 | Desenvolva a classe Main (método main) demonstrando o uso das duas estratégias (comente/descomente para trocar). |
| 6 | Compile com javac e execute com java Main. |
public class Main {
public static void main(String[] args) {
MediaStrategy estrategia = new Aritmetica(); // troque por new Geometrica()
Disciplina d = new Disciplina(estrategia);
d.setNome("Padrões de Desenvolvimento");
d.setP1(10);
d.setP2(5);
d.calcularMedia();
System.out.printf("P1: %.2f P2: %.2f Média: %.2f Situação: %s%n",
d.getP1(), d.getP2(), d.getMedia(), d.getSituacao());
}
}classDiagram
class MediaStrategy {
<<interface>>
+calcularMedia(p1, p2)
+verificarSituacao(media)
}
class Aritmetica {
+calcularMedia(p1, p2)
+verificarSituacao(media)
}
class Geometrica {
+calcularMedia(p1, p2)
+verificarSituacao(media)
}
class Disciplina {
-nome : String
-p1 : double
-p2 : double
-media : double
-situacao : String
-estrategia : MediaStrategy
+calcularMedia()
}
class Main
MediaStrategy <|.. Aritmetica
MediaStrategy <|.. Geometrica
Disciplina --> MediaStrategy
Main --> Disciplina
- Crie um repositório público no GitHub para armezar a resposta a esta tarefa.
- Faça commit de todo o código‑fonte (
src/). - Verifique se o projeto compila e executa (IDE sugerido InteliJ).
- Envie o link do repositório na plataforma de entrega da disciplina.
- Lembre‑se de usar o modificador
@Overridepara métodos implementados a partir da interface. - Teste cada estratégia separadamente trocando a instância no
Main. - Evite condicionais duplicando a lógica; deixe a variação confinada às classes de estratégia.