Interface do Administrador
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 81 de 87.
Desafio
FácilVamos expandir seu Sistema de Gerenciamento de Biblioteca com uma interface de administração! Uma biblioteca real precisa de recursos administrativos: adicionar novos livros à coleção, remover livros desatualizados e cadastrar novos membros. Você criará uma interface que define essas operações administrativas e as implementará em uma classe de administração dedicada.
Você continuará desenvolvendo seu código existente em cinco arquivos:
Book.java: Mantenha sua classe Book com todas as funcionalidades existentes: 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étodoremoveBook(String isbn)que encontre e remova um livro da coleção pelo seu ISBN. O método deve retornartruese o livro for encontrado e removido, efalsecaso contrário. Um livro só pode ser removido se estiver disponível no momento (não emprestado).LibraryAdmin.java: Crie uma interface chamadaLibraryAdminque defina 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 sucessoremoveBook(String isbn)- retorna um booleano indicando sucessoregisterUser(String id, String name)- retorna um booleano indicando sucesso
Em seguida, crie uma classe chamada
AdminServiceque implemente essa interface. O AdminService deve manter uma referência a uma Library (passada por meio de seu construtor) e implementar os três métodos delegando as operações à Library enquanto adiciona feedback apropriado. Ao adicionar um livro, crie um novo Book e adicione-o à biblioteca. Ao cadastrar um usuário, crie um novo User e cadastre-o.Main.java: Demonstre seu sistema de administração! Você receberá uma série de comandos administrativos como uma única string separada por vírgulas. Cada comando segue um destes formatos:ADD_BOOK:isbn:title:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW: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 ouCannot remove: [isbn]se o livro não existir ou estiver emprestado - Para REGISTER_USER: imprima
Registered: [name] - Para BORROW: use a funcionalidade existente de empréstimo da biblioteca
Depois de processar todos os comandos, imprima
Library status:, seguido pelos detalhes e pelo status de disponibilidade de cada livro no formato[details] - [Available/Borrowed].
Você receberá uma entrada: uma string de comandos separados 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 - BorrowedObserve como a interface de administração fornece um contrato claro para as operações administrativas, enquanto a implementação de AdminService trata da lógica efetiva. O sistema impede corretamente a remoção de um livro emprestado, ao mesmo tempo que permite a remoção de livros disponíveis. Essa separação entre interface e implementação é um princípio fundamental de OOP 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);
}
}
// Print library status
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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada10Tratamento de Exceções em POO
Hierarquia de Classes de ExceçãoExceções PersonalizadasErros Checked vs UncheckedPadrão Try With ResourcesRecapitulação - Usuário Validado13Projeto: Gerenciamento de Biblioteca
Visão Geral do Projeto e Modelagem UMLClasses Livro e UsuárioSistema de EmpréstimosFuncionalidade de BuscaInterface do AdministradorIntegração de Tratamento de ExceçõesTestes e Integração2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão IteratorPratique por conta própria: Compilador de Java online