🧩 Exercício 2 — Agregação
Tema: Sistema de pedidos e produtos
Objetivo: Implementar a relação de agregação entre classes independentes.
Enunciado:
Implemente as classes Produto e Pedido para representar um relacionamento de agregação, no qual um pedido agrega vários produtos. Cada produto possui nome e preço, e pode existir independentemente de um pedido (ex.: catálogo). O pedido mantém uma lista de produtos e deve ser capaz de calcular o valor total.
O programa principal, responsável por cadastrar produtos, criar pedidos e calcular totais, está incluído nesta página para fins de teste. Sua tarefa central é modelar corretamente a agregação, garantindo que a exclusão de um pedido não afete a existência dos produtos.
💻 Código Java
Exibindo apenas o programa principal (Main.java). Para ver tudo: ?codigo=123abcqwe.
//App.java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class App {
private static final Scanner sc = new Scanner(System.in);
private static final List<Produto> catalogo = new ArrayList<>();
private static final List<Pedido> pedidos = new ArrayList<>();
private static int sequenciaPedidos = 1;
public static void main(String[] args) {
int op;
do {
menu();
op = lerInt("Escolha uma opção: ");
switch (op) {
case 1 -> cadastrarProduto();
case 2 -> listarCatalogo();
case 3 -> criarPedido();
case 4 -> adicionarProdutoEmPedido();
case 5 -> listarPedidos();
case 6 -> verTotalDeUmPedido();
case 0 -> System.out.println("Encerrando...");
default -> System.out.println("Opção inválida!");
}
System.out.println();
} while (op != 0);
}
private static void menu() {
System.out.println("=== Sistema de Pedidos (AGREGAÇÃO) ===");
System.out.println("1) Cadastrar produto no catálogo");
System.out.println("2) Listar catálogo");
System.out.println("3) Criar novo pedido");
System.out.println("4) Adicionar produto a um pedido");
System.out.println("5) Listar pedidos e itens");
System.out.println("6) Ver total de um pedido");
System.out.println("0) Sair");
}
private static String lerStr(String msg) {
System.out.print(msg);
return sc.nextLine().trim();
}
private static int lerInt(String msg) {
while (true) {
try {
System.out.print(msg);
String s = sc.nextLine().trim();
return Integer.parseInt(s);
} catch (NumberFormatException e) {
System.out.println("Digite um número inteiro válido.");
}
}
}
private static double lerDouble(String msg) {
while (true) {
try {
System.out.print(msg);
String s = sc.nextLine().trim().replace(",", ".");
return Double.parseDouble(s);
} catch (NumberFormatException e) {
System.out.println("Digite um número (ex.: 10.50).");
}
}
}
// ===== Operações =====
private static void cadastrarProduto() {
System.out.println("--- Cadastrar Produto ---");
String nome = lerStr("Nome: ");
double preco = lerDouble("Preço (R$): ");
try {
Produto p = new Produto(nome, preco);
catalogo.add(p);
System.out.println("Produto cadastrado: " + p.getNome());
} catch (IllegalArgumentException ex) {
System.out.println("Falha ao cadastrar: " + ex.getMessage());
}
}
private static void listarCatalogo() {
System.out.println("--- Catálogo ---");
if (catalogo.isEmpty()) {
System.out.println("(vazio)");
return;
}
int i = 0;
for (Produto p: catalogo) {
System.out.print(i + ") ");
p.exibeProduto();
i++;
}
}
private static void criarPedido() {
Pedido p = new Pedido(sequenciaPedidos++);
pedidos.add(p);
System.out.println("Pedido criado: #" + p.getNumero());
}
private static void adicionarProdutoEmPedido() {
if (catalogo.isEmpty()) {
System.out.println("Cadastre ao menos um produto no catálogo primeiro.");
return;
}
if (pedidos.isEmpty()) {
System.out.println("Crie ao menos um pedido primeiro.");
return;
}
listarCatalogo();
int idxProd = lerInt("Índice do produto no catálogo: ");
if (idxProd < 0 || idxProd >= catalogo.size()) {
System.out.println("Índice de produto inválido.");
return;
}
listarPedidosSimples();
int numPedido = lerInt("Número do pedido: ");
Pedido alvo = encontrarPedidoPorNumero(numPedido);
if (alvo == null) {
System.out.println("Pedido não encontrado.");
return;
}
Produto escolhido = catalogo.get(idxProd);
alvo.adicionarProduto(escolhido);
System.out.println("Adicionado: " + escolhido + " ao Pedido #" + alvo.getNumero());
}
private static void listarPedidosSimples() {
System.out.println("--- Pedidos ---");
if (pedidos.isEmpty()) {
System.out.println("(vazio)");
return;
}
for (Pedido p : pedidos) {
System.out.println("Pedido #" + p.getNumero() + " (itens=" + p.getItens().size() + ")");
}
}
private static void listarPedidos() {
System.out.println("--- Detalhes dos Pedidos ---");
if (pedidos.isEmpty()) {
System.out.println("(vazio)");
return;
}
for (Pedido p : pedidos) {
p.exibePedido();
}
}
private static void verTotalDeUmPedido() {
if (pedidos.isEmpty()) {
System.out.println("Nenhum pedido criado.");
return;
}
listarPedidosSimples();
int num = lerInt("Número do pedido: ");
Pedido p = encontrarPedidoPorNumero(num);
if (p == null) {
System.out.println("Pedido não encontrado.");
return;
}
System.out.printf("Total do Pedido " + p.getNumero() + " R$ " + p.calcularTotal() + " %n");
}
private static Pedido encontrarPedidoPorNumero(int num) {
for (Pedido p : pedidos) if (p.getNumero() == num) return p;
return null;
}
}
▶️ Como testar
- Salve os arquivos
Produto.java,Pedido.javaeApp.javana mesma pasta. Se tudo estiver ok pelo VS Code (sem marcações de erro), executar o programa para testar. - No menu interativo, cadastre produtos no catálogo, crie pedidos e adicione itens aos pedidos.
- Observe que os produtos continuam existindo mesmo que um pedido seja descartado — característica da agregação.
🧾 Exemplo de Execução
Abaixo está um exemplo de saída no terminal ao executar o programa principal do Exercício 2 — Agregação:
=== Sistema de Pedidos (AGREGAÇÃO) ===
1) Cadastrar produto no catálogo
2) Listar catálogo
3) Criar novo pedido
4) Adicionar produto a um pedido
5) Listar pedidos e itens
6) Ver total de um pedido
0) Sair
Escolha uma opção: 1
--- Cadastrar Produto ---
Nome: Camiseta Branca
Preço (R$): 59.90
Produto cadastrado: Produto{nome='Camiseta Branca', preco=59.90}
Escolha uma opção: 1
--- Cadastrar Produto ---
Nome: Tênis Esportivo
Preço (R$): 249.90
Produto cadastrado: Produto{nome='Tênis Esportivo', preco=249.90}
Escolha uma opção: 3
Pedido criado: #1
Escolha uma opção: 4
--- Catálogo ---
0 -> Produto{nome='Camiseta Branca', preco=59.90}
1 -> Produto{nome='Tênis Esportivo', preco=249.90}
Índice do produto no catálogo: 0
--- Pedidos ---
Pedido #1 (itens=0)
Número do pedido: 1
Adicionado: Produto{nome='Camiseta Branca', preco=59.90} ao Pedido #1
Escolha uma opção: 4
--- Catálogo ---
0 -> Produto{nome='Camiseta Branca', preco=59.90}
1 -> Produto{nome='Tênis Esportivo', preco=249.90}
Índice do produto no catálogo: 1
--- Pedidos ---
Pedido #1 (itens=1)
Número do pedido: 1
Adicionado: Produto{nome='Tênis Esportivo', preco=249.90} ao Pedido #1
Escolha uma opção: 5
--- Detalhes dos Pedidos ---
Pedido #1 [itens=2, total=R$ 309.80]
0 -> Produto{nome='Camiseta Branca', preco=59.90}
1 -> Produto{nome='Tênis Esportivo', preco=249.90}
Escolha uma opção: 6
--- Pedidos ---
Pedido #1 (itens=2)
Número do pedido: 1
Total do Pedido #1: R$ 309.80
Escolha uma opção: 0
Encerrando...
💡 Observação: Note que os produtos continuam existindo no catálogo mesmo após o encerramento do pedido.
Isso caracteriza uma relação de agregação, em que o objeto agregado (Produto) pode existir independentemente do objeto agregador (Pedido).