Menu
Coddy logo textTech

Interface do Administrador

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 81 de 87.

challenge icon

Desafio

Fácil

Vamos expandir seu Sistema de Gerenciamento de Biblioteca com uma Interface de Administrador! Uma biblioteca real precisa de capacidades administrativas — adicionar novos livros à coleção, remover os desatualizados e registrar novos membros. Você criará uma interface que define essas operações administrativas e as implementará em uma classe de administração dedicada.

Você continuará construindo sobre seu código existente em cinco arquivos:

  • Book.java: Mantenha sua classe Book com toda a funcionalidade existente — isbn, title, author, isAvailable, borrowedBy, getDetails() e os getters/setters apropriados.
  • User.java: Mantenha sua classe User inalterada com id, name, o ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() e toString().
  • Library.java: Mantenha sua classe Library com todos os métodos existentes. Adicione um novo método removeBook(String isbn) que encontra e remove um livro da coleção pelo seu ISBN. O método deve retornar true se o livro foi encontrado e removido, e false caso contrário. Um livro só pode ser removido se estiver disponível no momento (não emprestado).
  • LibraryAdmin.java: Crie uma interface chamada LibraryAdmin que define o contrato para operações administrativas. Sua interface deve declarar três métodos:
    • addBook(String isbn, String title, String author) - retorna um booleano indicando sucesso
    • removeBook(String isbn) - retorna um booleano indicando sucesso
    • registerUser(String id, String name) - retorna um booleano indicando sucesso

    Em seguida, crie uma classe chamada AdminService que implementa esta interface. O AdminService deve manter uma referência a uma Library (passada através de seu construtor) e implementar todos os três métodos delegando para a Library enquanto adiciona o feedback apropriado. Ao adicionar um livro, crie um novo Book e adicione-o à biblioteca. Ao registrar um usuário, crie um novo User e registre-o.

  • Main.java: Demonstre seu sistema de administração! Você receberá uma série de comandos de administração como uma única string separada por vírgulas. Cada comando segue um destes formatos:
    • ADD_BOOK:isbn:title:author
    • REMOVE_BOOK:isbn
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Crie uma Library e um AdminService. Processe cada comando e imprima o resultado:

    • Para ADD_BOOK: imprima Added: [title] em caso de sucesso
    • Para REMOVE_BOOK: imprima Removed: [isbn] em caso de sucesso, ou Cannot remove: [isbn] se o livro não existir ou estiver emprestado
    • Para REGISTER_USER: imprima Registered: [name]
    • Para BORROW: use a funcionalidade de empréstimo da biblioteca existente

    Após processar todos os comandos, imprima Library status: seguido pelos detalhes de cada livro e status de disponibilidade no formato [details] - [Available/Borrowed].

Você receberá uma entrada: uma string de comandos separada por vírgulas.

Por exemplo, com a entrada REGISTER_USER:U001:Alice,ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Design Patterns:Gang of Four,BORROW:U001:ISBN-001,REMOVE_BOOK:ISBN-001,REMOVE_BOOK:ISBN-002, sua saída seria:

Registered: Alice
Added: Clean Code
Added: Design Patterns
Alice borrowed Clean Code
Cannot remove: ISBN-001
Removed: ISBN-002
Library status:
[ISBN-001] Clean Code by Robert Martin - Borrowed

Observe como a interface de administração fornece um contrato limpo para operações administrativas, enquanto a implementação AdminService lida com a lógica real. O sistema impede corretamente a remoção de um livro emprestado, permitindo a remoção dos disponíveis. Essa separação de interface e implementação é um princípio fundamental de POO que torna seu código mais fácil de manter e testar!

Experimente você mesmo

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler os comandos separados por vírgula
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Criar Library e AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Processar cada comando
        for (String command : commands) {
            String[] parts = command.split(":");
            String operation = parts[0];
            
            if (operation.equals("ADD_BOOK")) {
                String isbn = parts[1];
                String title = parts[2];
                String author = parts[3];
                if (adminService.addBook(isbn, title, author)) {
                    System.out.println("Added: " + title);
                }
            } else if (operation.equals("REMOVE_BOOK")) {
                String isbn = parts[1];
                if (adminService.removeBook(isbn)) {
                    System.out.println("Removed: " + isbn);
                } else {
                    System.out.println("Cannot remove: " + isbn);
                }
            } else if (operation.equals("REGISTER_USER")) {
                String id = parts[1];
                String name = parts[2];
                if (adminService.registerUser(id, name)) {
                    System.out.println("Registered: " + name);
                }
            } else if (operation.equals("BORROW")) {
                String userId = parts[1];
                String isbn = parts[2];
                library.borrowBook(userId, isbn);
            }
        }
        
        // Imprimir o status da biblioteca
        System.out.println("Library status:");
        ArrayList<Book> allBooks = library.getAllBooks();
        for (Book book : allBooks) {
            String status = book.isAvailable() ? "Available" : "Borrowed";
            System.out.println(book.getDetails() + " - " + status);
        }
    }
}

Todas as lições de Programação Orientada a Objetos