Interfejs administratora
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 81 z 87.
Wyzwanie
ŁatwyRozbudujmy Twój System Zarządzania Biblioteką o interfejs administratora! Prawdziwa biblioteka potrzebuje możliwości administracyjnych: dodawania nowych książek do zbiorów, usuwania nieaktualnych i rejestrowania nowych członków. Utworzysz interfejs definiujący te operacje administracyjne, a następnie zaimplementujesz je w dedykowanej klasie administratora.
Będziesz kontynuować pracę nad istniejącym kodem w pięciu plikach:
Book.java: Zachowaj swoją klasę Book ze wszystkimi dotychczasowymi funkcjonalnościami: isbn, title, author, isAvailable, borrowedBy, getDetails() oraz odpowiednimi metodami pobierającymi i ustawiającymi.User.java: Zachowaj klasę User bez zmian, z polami id, name, tablicą ArrayList borrowedBooks oraz metodami borrowBook(), returnBook(), getBorrowedCount() i toString().Library.java: Zachowaj klasę Library ze wszystkimi dotychczasowymi metodami. Dodaj nową metodęremoveBook(String isbn), która wyszukuje książkę w zbiorach po jej numerze ISBN i usuwa ją. Metoda powinna zwracaćtrue, jeśli książka została znaleziona i usunięta, a w przeciwnym raziefalse. Książkę można usunąć tylko wtedy, gdy jest aktualnie dostępna (nie została wypożyczona).LibraryAdmin.java: Utwórz interfejs o nazwieLibraryAdmin, który definiuje kontrakt dla operacji administracyjnych. Interfejs powinien deklarować trzy metody:addBook(String isbn, String title, String author)- zwraca wartość boolean wskazującą powodzenie operacjiremoveBook(String isbn)- zwraca wartość boolean wskazującą powodzenie operacjiregisterUser(String id, String name)- zwraca wartość boolean wskazującą powodzenie operacji
Następnie utwórz klasę o nazwie
AdminService, która implementuje ten interfejs. AdminService powinna przechowywać referencję do obiektu Library (przekazaną przez konstruktor) i implementować wszystkie trzy metody, delegując działania do Library oraz wyświetlając odpowiednie komunikaty. Podczas dodawania książki utwórz nowy obiekt Book i dodaj go do biblioteki. Podczas rejestrowania użytkownika utwórz nowy obiekt User i zarejestruj go.Main.java: Zademonstruj działanie systemu administracyjnego! Otrzymasz serię poleceń administratora w postaci pojedynczego ciągu znaków, w którym polecenia są oddzielone przecinkami. Każde polecenie ma jeden z następujących formatów:ADD_BOOK:isbn:title:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW:userId:isbn
Utwórz obiekt Library i obiekt AdminService. Przetwórz każde polecenie i wyświetl wynik:
- Dla ADD_BOOK: w przypadku powodzenia wyświetl
Added: [title] - Dla REMOVE_BOOK: w przypadku powodzenia wyświetl
Removed: [isbn], a jeśli książka nie istnieje lub jest wypożyczona, wyświetlCannot remove: [isbn] - Dla REGISTER_USER: wyświetl
Registered: [name] - Dla BORROW: użyj istniejącej funkcjonalności wypożyczania w bibliotece
Po przetworzeniu wszystkich poleceń wyświetl
Library status:, a następnie szczegóły każdej książki i jej status dostępności w formacie[details] - [Available/Borrowed].
Otrzymasz jedno wejście: ciąg poleceń oddzielonych przecinkami.
Na przykład dla wejścia 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 wynikiem będzie:
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 - BorrowedZwróć uwagę, że interfejs administratora zapewnia przejrzysty kontrakt dla operacji administracyjnych, a implementacja AdminService obsługuje właściwą logikę. System prawidłowo uniemożliwia usunięcie wypożyczonej książki, jednocześnie pozwalając usuwać książki dostępne. Taki podział na interfejs i implementację to kluczowa zasada programowania obiektowego (OOP), dzięki której kod jest łatwiejszy w utrzymaniu i testowaniu!
Spróbuj swoich sił
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj polecenia oddzielone przecinkami
String input = scanner.nextLine();
String[] commands = input.split(",");
// Utwórz Library i AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// Przetwórz każde polecenie
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);
}
}
// Wyświetl stan biblioteki
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);
}
}
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik13Projekt: System zarządzania biblioteką
Przegląd projektu i projekt UMLKlasy książki i użytkownikaSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraIntegracja obsługi wyjątkówTestowanie i integracja2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online