This is an old revision of the document!
În cadrul acestui laborator se va lucra pe baza scheletului pus la dispoziție.
Fiecare TODO este numerotat conform problemei ce trebuie rezolvată.
În urma realizării cerințelor, se va obține o platformă de streaming muzical.
Se cere implementarea Design Pattern-ului Singleton în cadrul clasei Spotify. Clasa Spotify reprezintă componenta principală a aplicației, gestionând datele platformei (utilizatori și melodii).
Pattern-ul Singleton asigură existența unei singure instanțe a clasei pe parcursul execuției programului.
Cerințe de implementare:
Pornind de la clasa abstractă User, se va implementa Design Pattern-ul Factory prin intermediul claselor Regular, Premium și UltraPremium care moștenesc User.
Factory pattern centralizează logica de creare a obiectelor, ascunzând detaliile de implementare și permițând extinderea ușoară cu noi tipuri.
Valorile pentru câmpul subscription:
Cerințe de implementare:
Se cere implementarea Design Pattern-ului Builder în cadrul clasei Song.
Un cântec conține: title, artists, duration, views, releaseDate, ratings.
Builder pattern permite construirea obiectelor complexe pas cu pas, oferind o alternativă la constructorii cu mulți parametri.
Cerințe de implementare:
Exemplu de utilizare Builder (în JSONReader):
Song song = new Song.Builder() .title(title) .artists(artists) .duration(duration) .views(views) .releaseDate(releaseDate) .ratings(ratings) .build();
Exemplu de metodă setter în Builder:
public Builder title(String title) { this.title = title; return this; }
Fiecare utilizator poate alege modul în care sunt afișate cântecele, în funcție de un criteriu de sortare preferat.
Strategy pattern permite schimbarea algoritmului de sortare la runtime, fără a modifica codul clientului.
Interfața SortingStrategy definește metoda sortedSongs(List<Song>).
Strategii de implementat:
Cerințe de implementare:
Hint pentru sortare cu Comparator:
// Sortare DESCRESCĂTOARE după un câmp songs.sort((s1, s2) -> s2.getField().compareTo(s1.getField())); // Sortare CRESCĂTOARE după un câmp songs.sort((s1, s2) -> s1.getField().compareTo(s2.getField()));
Utilizatorii platformei pot primi notificări când un cântec nou este adăugat.
Observer pattern permite notificarea automată a obiectelor interesate (observers) când starea unui obiect (subject) se schimbă.
Interfețele din schelet:
Cerințe de implementare:
Pentru calculul venitului total lunar, se va folosi Design Pattern-ul Visitor.
Visitor pattern permite adăugarea de operații noi asupra obiectelor fără a modifica clasele acestora. „Vizitorul” parcurge elementele și aplică operații specifice fiecărui tip.
Interfețele din schelet:
Formula de calcul a venitului per utilizator:
Cerințe de implementare:
Exemplu de utilizare Visitor (în Spotify.calculateRevenue):
RevenueVisitor visitor = new RevenueVisitor(); for (User user : users) { user.accept(visitor); } return visitor.getTotalRevenue();
Implementați pattern-ul Observer și pentru rating-uri.
Când un utilizator adaugă un rating unui cântec, toți utilizatorii care au dat anterior un rating aceluiași cântec vor fi notificați.
Cerințe de implementare: