Interface administrateur
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 81 sur 87.
Défi
FacileÉtendons votre système de gestion de bibliothèque avec une interface d’administration ! Une véritable bibliothèque a besoin de fonctionnalités administratives : ajouter de nouveaux livres à la collection, supprimer ceux qui sont obsolètes et inscrire de nouveaux membres. Vous allez créer une interface qui définit ces opérations administratives et les implémenter dans une classe d’administration dédiée.
Vous continuerez à développer votre code existant réparti sur cinq fichiers :
Book.java: conservez votre classe Book avec toutes ses fonctionnalités existantes : isbn, title, author, isAvailable, borrowedBy, getDetails(), ainsi que les getters/setters appropriés.User.java: conservez votre classe User telle quelle avec id, name, la ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() et toString().Library.java: conservez votre classe Library avec toutes ses méthodes existantes. Ajoutez une nouvelle méthoderemoveBook(String isbn)qui recherche et supprime un livre de la collection à partir de son ISBN. La méthode doit retournertruesi le livre a été trouvé et supprimé, etfalsedans le cas contraire. Un livre ne peut être supprimé que s’il est actuellement disponible (et non emprunté).LibraryAdmin.java: créez une interface appeléeLibraryAdminqui définit le contrat des opérations administratives. Votre interface doit déclarer trois méthodes :addBook(String isbn, String title, String author)- retourne un booléen indiquant la réussiteremoveBook(String isbn)- retourne un booléen indiquant la réussiteregisterUser(String id, String name)- retourne un booléen indiquant la réussite
Créez ensuite une classe appelée
AdminServicequi implémente cette interface. Le service AdminService doit conserver une référence vers une Library (transmise par son constructeur) et implémenter les trois méthodes en les déléguant à la Library tout en fournissant des retours appropriés. Lors de l’ajout d’un livre, créez un nouveau Book et ajoutez-le à la bibliothèque. Lors de l’inscription d’un utilisateur, créez un nouvel User et inscrivez-le.Main.java: démontrez votre système d’administration ! Vous recevrez une série de commandes d’administration sous la forme d’une seule chaîne séparée par des virgules. Chaque commande suit l’un des formats suivants :ADD_BOOK:isbn:title:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW:userId:isbn
Créez une Library et un AdminService. Traitez chaque commande et affichez le résultat :
- Pour ADD_BOOK : affichez
Added: [title]en cas de réussite - Pour REMOVE_BOOK : affichez
Removed: [isbn]en cas de réussite, ouCannot remove: [isbn]si le livre n’existe pas ou est emprunté - Pour REGISTER_USER : affichez
Registered: [name] - Pour BORROW : utilisez la fonctionnalité d’emprunt existante de la bibliothèque
Après avoir traité toutes les commandes, affichez
Library status:, suivi des détails de chaque livre et de son statut de disponibilité au format[details] - [Available/Borrowed].
Vous recevrez une entrée : une chaîne de commandes séparées par des virgules.
Par exemple, avec l’entrée 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, votre sortie serait :
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 - BorrowedRemarquez comment l’interface d’administration fournit un contrat clair pour les opérations administratives, tandis que l’implémentation AdminService gère la logique réelle. Le système empêche correctement la suppression d’un livre emprunté tout en autorisant celle des livres disponibles. Cette séparation entre l’interface et l’implémentation constitue un principe clé de la POO qui rend votre code plus facile à maintenir et à tester !
Essayez vous-même
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire les commandes séparées par des virgules
String input = scanner.nextLine();
String[] commands = input.split(",");
// Créer Library et AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// Traiter chaque commande
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);
}
}
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé10Gestion des exceptions en POO
Hiérarchie des classes d'exceptionExceptions personnaliséesErreurs Checked vs UncheckedPattern Try-with-resourcesRécapitulatif - Utilisateur validé13Projet : Gestion de bibliothèque
Présentation du projet et conception UMLClasses Livre et UtilisateurSystème d'empruntFonctionnalité de rechercheInterface administrateurIntégration de la gestion des exceptionsTests et intégration2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron ItérateurEntraînez-vous par vous-même : Compilateur Java en ligne