Interfaz de administrador
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 81 de 87.
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étodoremoveBook(String isbn)que busque y elimine un libro de la colección por su ISBN. El método debe devolvertruesi el libro fue encontrado y eliminado, yfalseen caso contrario. Un libro solo puede ser eliminado si está disponible actualmente (no prestado).LibraryAdmin.java: Crea una interfaz llamadaLibraryAdminque 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 éxitoremoveBook(String isbn)- devuelve un booleano indicando el éxitoregisterUser(String id, String name)- devuelve un booleano indicando el éxito
Luego crea una clase llamada
AdminServiceque 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:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW: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, oCannot 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 - BorrowedObserva 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
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado10Manejo de excepciones en POO
Jerarquía de clases de excepcionesExcepciones personalizadasErrores Checked vs UncheckedPatrón Try With ResourcesResumen - Usuario validado13Proyecto: Gestión de biblioteca
Descripción general del proyecto y diseño UMLClases de Libro y Usuario2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Iterator