Menu
Coddy logo textTech

Interfaz de administrador

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 81 de 87.

challenge icon

Desafío

Fácil

¡Vamos a expandir tu Sistema de Gestión de Biblioteca con una Interfaz de Administrador! Una biblioteca real necesita capacidades administrativas: añadir nuevos libros a la colección, eliminar los obsoletos y registrar nuevos miembros. Crearás una interfaz que defina estas operaciones administrativas y las implementarás en una clase de administración dedicada.

Continuarás construyendo sobre tu código existente en cinco archivos:

  • Book.java: Mantén tu clase Book con toda la funcionalidad existente: isbn, title, author, isAvailable, borrowedBy, getDetails() y los getters/setters apropiados.
  • User.java: Mantén tu clase User sin cambios con id, name, el ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() y toString().
  • Library.java: Mantén tu clase Library con todos los métodos existentes. Añade un nuevo método removeBook(String isbn) que busque y elimine un libro de la colección por su ISBN. El método debe devolver true si el libro fue encontrado y eliminado, y false en caso contrario. Un libro solo puede ser eliminado si está disponible actualmente (no prestado).
  • LibraryAdmin.java: Crea una interfaz llamada LibraryAdmin que defina el contrato para las operaciones administrativas. Tu interfaz debe declarar tres métodos:
    • addBook(String isbn, String title, String author) - devuelve un booleano indicando el éxito
    • removeBook(String isbn) - devuelve un booleano indicando el éxito
    • registerUser(String id, String name) - devuelve un booleano indicando el éxito

    Luego crea una clase llamada AdminService que implemente esta interfaz. El AdminService debe mantener una referencia a una Library (pasada a través de su constructor) e implementar los tres métodos delegando en la Library mientras añade la retroalimentación adecuada. Al añadir un libro, crea un nuevo Book y añádelo a la biblioteca. Al registrar un usuario, crea un nuevo User y regístralo.

  • Main.java: ¡Demuestra tu sistema de administración! Recibirás una serie de comandos de administración como una única cadena separada por comas. Cada comando sigue uno de estos formatos:
    • ADD_BOOK:isbn:title:author
    • REMOVE_BOOK:isbn
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Crea una Library y un AdminService. Procesa cada comando e imprime el resultado:

    • Para ADD_BOOK: imprime Added: [title] en caso de éxito
    • Para REMOVE_BOOK: imprime Removed: [isbn] en caso de éxito, o Cannot remove: [isbn] si el libro no existe o está prestado
    • Para REGISTER_USER: imprime Registered: [name]
    • Para BORROW: utiliza la funcionalidad de préstamo de la biblioteca existente

    Después de procesar todos los comandos, imprime Library status: seguido de los detalles de cada libro y su estado de disponibilidad en el formato [details] - [Available/Borrowed].

Recibirás una entrada: una cadena de comandos separada por comas.

Por ejemplo, con la 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, tu salida sería:

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

Observa cómo la interfaz de administración proporciona un contrato limpio para las operaciones administrativas, mientras que la implementación de AdminService maneja la lógica real. El sistema evita correctamente la eliminación de un libro prestado mientras permite la eliminación de los disponibles. ¡Esta separación de interfaz e implementación es un principio clave de la POO que hace que tu código sea más mantenible y testeable!

Pruébalo tú mismo

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

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lee los comandos separados por comas
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Crea Library y AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Procesa 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);
            }
        }
        
        // Imprime el estado de la 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 las lecciones de Programación Orientada a Objetos