Pular para o conteúdo
Bruno Dórea
Todos os posts

8 mins de leitura


Implementando um Catálogo de Produtos com Padrão Observer

Desafios de Código Java Intermediários - Design Patterns - 3/5


Java AI Powered
Java AI Powered

Descrição

Você deve aprimorar o sistema de monitoramento de produtos, adicionando a capacidade de exibir uma mensagem específica para cada usuário quando um novo produto é adicionado ao catálogo. Além disso, implemente a funcionalidade de permitir que os usuários cancelem sua assinatura para deixar de receber notificações sobre novos produtos.

Entrada

  • O programa deve solicitar ao usuário que insira o nome do usuário para realizar a ação desejada.
  • Se o usuário deseja cancelar a assinatura, ele deve digitar "cancelar". Se desejar receber notificações, deve digitar qualquer outro valor.
  • Se o usuário optar por adicionar um novo produto, será solicitado o nome do produto a ser adicionado.

Saída

Após cada ação, o programa deve exibir mensagens informativas para indicar se a assinatura foi cancelada com sucesso, se o usuário ainda está assinando notificações ou se o produto foi adicionado ao catálogo.

Exemplos

A tabela abaixo apresenta exemplos com alguns dados de entrada e suas respectivas saídas esperadas. Certifique-se de testar seu programa com esses exemplos e com outros casos possíveis.

EntradaSaída
TV
SmartNotificacao recebida: Novo produto adicionado - TV
999
S
EntradaSaída
Smartphone
AppleNotificacao recebida: Novo produto adicionado - Smartphone
3000
S
EntradaSaída
Mouse
Sem FioPrograma Encerrado.
340
N

Resolução

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
interface Observer {
    void update(String productName);
}
 
class User implements Observer {
    private String name;
    private boolean isSubscribed;
 
    public User(String name) {
        this.name = name;
        this.isSubscribed = true;
    }
 
    public void setSubscription(boolean isSubscribed) {
        this.isSubscribed = isSubscribed;
    }
 
    @Override
    public void update(String productName) {
        if (isSubscribed) {
            System.out.println("Notificacao recebida: Novo produto adicionado - " + productName);
        }
    }
}
 
interface CatalogObservable {
    void addObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String productName);
}
 
class Catalog implements CatalogObservable {
    private List<Observer> observers = new ArrayList<>();
 
    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }
 
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
 
    @Override
    public void notifyObservers(String productName) {
        for (Observer observer : observers) {
            observer.update(productName);
        }
    }
 
    public void addProduct(String name, String description, double price) {
        notifyObservers(name);
    }
}
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
 
        Catalog catalog = new Catalog();
        User user = new User("Usuário 1");
 
        catalog.addObserver(user);
 
        while (scanner.hasNext()) {
            String name = scanner.nextLine();
            String description = scanner.nextLine();
            double price = scanner.nextDouble();
 
            scanner.nextLine();
            String subscribeChoice = scanner.nextLine();
 
            if (subscribeChoice.equalsIgnoreCase("N")) {
                user.setSubscription(false);
                System.out.println("Programa Encerrado.");
                break;
            }
 
            catalog.addProduct(name, description, price);
        }
 
        scanner.close();
    }
}

Para encontrar outras soluções, verifique aqui.

Caso encontre algum erro ou tenha sugestões, clique aqui e abra uma issue no Github.