Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo:laboratoare:11 [2025/12/14 17:22]
george.tudor1906
poo:laboratoare:11 [2025/12/14 17:54] (current)
george.tudor1906
Line 1: Line 1:
  
-===== Laboratorul 11 – Design Patterns =====+===== Laboratorul 11 – Design Patterns ​(1) =====
  
-<note important+<hidden
-Acest laborator implementează o platformă de catalog academic folosind Design Patterns. +{{:poo:​laboratoare:​rezolvare_dp_catalog.zip|}} 
-Se lucrează cu clase precumCatalog, Course, User, Student, Parent, Teacher, Assistant, Grade. +</hidden>
-Clasa Test conține main-ul pentru testarea tuturor exercițiilor+
-</note>+
  
 === Problema 1 - Singleton === === Problema 1 - Singleton ===
  
-Implementați ​clasa **Catalog** care conține o listă cu obiecte de tip **Course**. +Implementați ​o clasă ​**Catalog** care conține o listă cu obiecte de tip **Course**. 
-Trebuie ​să vă asigurați că pentru această clasă va putea exista o singură instanță +Va trebui ​să vă asigurați că pentru această clasă va putea exista o singură instanță 
-care să poată fi accesată din orice clasă a proiectului. +care să poată fi accesată din orice clasă a proiectului. Implementați metoda ​toString 
- +pentru clasa Catalog.
-Cerințe de implementare:​ +
- +
-  * Declarați constructorul clasei ca **PRIVATE**;​ +
-  * Adăugați un atribut **STATIC PRIVATE** de tip **Catalog** pentru instanța unică; +
-  * Implementați metoda ​**PUBLICĂ STATICĂ** //​getInstance()//;​ +
-  * Implementați metoda //​toString()// ​pentru clasa Catalog.+
  
 <code java> <code java>
Line 33: Line 25:
  
 Pornind de la clasa abstractă **User**, definiți clasele **Student**,​ **Parent**, Pornind de la clasa abstractă **User**, definiți clasele **Student**,​ **Parent**,
-**Assistant** și **Teacher** care vor moșteni clasa **User**.+**Assistant** și **Teacher** care vor moșteni clasa **User**:
  
 <code java> <code java>
Line 50: Line 42:
 </​code>​ </​code>​
  
-Cerințde implementare:​ +Pentru a putea realiza o instanțiere ușoară a obiectelor pentru aceste tipuri ​de clase
- +veți implementa o clasă ​**UserFactory** care va avea o metodă statică **createUser** ce 
-  * Clasele **Student****Parent**, **Assistant**,​ **Teacher** extind **User**; +va returna ​un obiect de tip User (se va folosi șablonul ​de proiectare ​Factory).
-  ​* ​**UserFactory** ​conține metoda statică //​createUser()// ​care primește tipul și returnează instanța corespunzătoare; +
-  ​Metoda //createUser(String type, String firstName, String lastName)// returnează ​un obiect de tip User+
- +
-Exemplu ​de utilizare ​Factory+
- +
-<code java> +
-User studentA = UserFactory.createUser("​Student",​ "​A",​ "​Popescu"​)+
-User teacher = UserFactory.createUser("​Teacher",​ "​Teacher",​ "​Georgescu"​);​ +
-User assistant = UserFactory.createUser("​Assistant",​ "​Assistant",​ "​Popescu"​);​ +
-User mother = UserFactory.createUser("​Parent",​ "​M_AC",​ "​Ionescu"​);​ +
-</​code>​+
  
 === Problema 3 - Builder === === Problema 3 - Builder ===
  
 Pe baza claselor definite anterior, veți completa implementarea clasei **Course**. Pe baza claselor definite anterior, veți completa implementarea clasei **Course**.
-Un obiect de tip Course conține+În cadrul aplicației noastre, un obiect de tipul Course ​o să conțină
-  * un nume (String) +  * un nume (de tipul String) 
-  * un profesor titular ​(Teacher) +  * un profesor titular 
-  * o listă de asistenți ​(Assistant)+  * o listă de asistenți
   * o colecție ordonată cu obiecte de tipul Grade   * o colecție ordonată cu obiecte de tipul Grade
   * o listă de studenți   * o listă de studenți
  
-Se va folosi șablonul de proiectare **Builder** pentru ​a seta câmpurile unui obiect ​Course. +Pentru a putea seta câmpurile unui obiect de tip Course, veți folosi șablonul de 
- +proiectare **Builder**. Definiți toString ​pentru ​clasa Course.
-Clasa **Grade**:+
  
 <code java> <code java>
Line 113: Line 93:
 </​code>​ </​code>​
  
-Cerințe de implementare:​ +Modificați clasa **Grade** astfel încât două obiecte de tip Grade vor putea să fie 
- +comparate ​(în funcție de punctajul total). De asemenea, va trebui ​să adăugați în 
-  * Definiți o clasă internă statică ​**CourseBuilder** în **Course**;​ +clasa Catalog o listă cu obiecte de tip Course.
-  * Builder-ul conține câmpuri identice cu cele din **Course**;​ +
-  * Fiecare metodă setter din Builder returnează //this// (pentru *method chaining*); +
-  * Metoda //build()// creează și returnează obiectul **Course**;​ +
-  * Modificați clasa Grade să implementeze **Comparable** (comparare după punctaj total); +
-  * Adăugați în clasa Catalog o listă cu obiecte de tip Course; +
-  * Definiți //​toString()//​ pentru clasa Course. +
- +
-Exemplu de utilizare Builder: +
- +
-<code java> +
-Course course = new Course.CourseBuilder("​POO"​) +
-        .teacher((Teacher) teacher) +
-        .assistant((Assistant) assistant) +
-        .grade(new Grade("​POO",​ (Student) studentA, 4d, 5d)) +
-        .grade(new Grade("​POO",​ (Student) studentB, 3d, 3d)) +
-        .strategy(new BestExamScore()) +
-        .build(); +
-</​code>​+
  
 === Problema 4 - Observer === === Problema 4 - Observer ===
  
-Aplicația permite părinților unui student să se aboneze la **Catalog** pentru a primi +Aplicația ​noastră le permite părinților unui student să se aboneze la Catalog pentru 
-notificări ​când copilul este notat de către un profesor sau asistent.+putea primi notificări ​în momentul în care copilul este notat de către un profesor 
 +sau de către un asistent. Pentru a putea realiza acest lucru, veți folosi șablonul 
 +de proiectare **Observer** și veți implementa o clasă **Notification** (stabiliți voi 
 +care sunt atributele și metodele din această clasă – este obligatoriu să fie 
 +suprascrisă metoda toString).
  
-Interfețe:+Ce clasă va implementa interfața Observer și ce clasă va implementa interfața Subject?
  
 <code java> <code java>
Line 154: Line 120:
 </​code>​ </​code>​
  
-Cerințe de implementare: +Hint
- +  * Parent va ține minte și o listă ​notificărilor, iar Catalog o listă a Observatorilor. 
-  * **Catalog** implementează **Subject** și menține lista de observatori;​ +  * Atenție! Primesc notificări doar părinții studentului respectiv! ​Modificați clasa Student ​astfel încât ​să avem memorați și părinții ​pentru fiecare Student și adăugați ​o metodă ​isParent(Observer parent) ​care verifică dacă un observator este rintele ​studentului ​curent.
-  * **Parent** implementează **Observer** ​și ține o listă ​de notificări; +
-  * Creați clasa **Notification** cu atributele necesare (obligatoriu //​toString()//​);​ +
-  * Modificați clasa **Student** să memoreze ​părinții ​(mother, father); +
-  * Adăugați ​metoda //isParent(Observer parent)// în Student; +
-  * **Atenție**:​ Primesc notificări doar rinții ​studentului ​respectiv! +
- +
-Exemplu de utilizare Observer: +
- +
-<code java> +
-((Student) studentB).setMother((Parent) mother); +
-((Student) studentB).setFather((Parent) father); +
- +
-catalog.addObserver((Parent) mother); +
-catalog.addObserver((Parent) father); +
-catalog.notifyObservers(new Grade("​POO",​ (Student) studentB, 2.5d, 3d)); +
-</​code>​+
  
 === Problema 5 - Strategy === === Problema 5 - Strategy ===
  
 Fiecare profesor va aplica o politică prin care la sfârșitul semestrului selectează Fiecare profesor va aplica o politică prin care la sfârșitul semestrului selectează
-cel mai bun student.+cel mai bun student. ​Pentru a realiza acest lucru în cadrul implementării,​ va trebui 
 +să folosiți șablonul de proiectare **Strategy**. Veți defini câte o clasă pentru 
 +fiecare din următoarele strategii:
  
-Interfața Strategy:+  * **BestPartialScore** – această strategie va selecta studentul care are cel mai mare punctaj în timpul semestrului;​ 
 +  * **BestExamScore** – această strategie va selecta studentul care are cel mai mare punctaj în examen; 
 +  * **BestTotalScore** – această strategie va selecta studentul care are punctajul total maxim.
  
 <code java> <code java>
Line 187: Line 141:
 </​code>​ </​code>​
  
-Strategii de implementat:​ +Veți adăuga în clasa **Course** un atribut Strategy, și o metodă cu antetul: 
- +//public Student getBestStudent();// 
-  * **BestPartialScore** - selectează studentul cu cel mai mare punctaj pe parcurs; +Metoda ​va returna ​cel mai bun student, ținând cont de strategia setată ​de profesor 
-  * **BestExamScore** - selectează studentul cu cel mai mare punctaj la examen; +pentru curs.
-  * **BestTotalScore** - selectează studentul cu punctajul total maxim. +
- +
-Cerințe de implementare:​ +
- +
-  * Implementați cele trei strategii;​ +
-  * Adăugați în clasa **Course** un atribut Strategy; +
-  * Adăugați metoda ​//public Student getBestStudent()// ​în Course; +
-  ​* ​Metoda ​returnează ​cel mai bun student, ținând cont de strategia setată.+
  
 === Problema 6 - Visitor === === Problema 6 - Visitor ===
  
-Folosind șablonul Visitor, implementați funcționalitatea prin care: +Folosind șablonul ​de proiectare **Visitor**vom implementa funcționalitatea prin care 
-  * Fiecare **asistent** poate completa notele de pe parcurs ale studenților; +fiecare ​asistent ​o să poată ​completa notele de pe parcurs ale studenților, iar fiecare 
-  * Fiecare **profesor** poate completa notele de la examen ale studenților. +profesor ​o să poată ​completa notele de la examen ale studenților ​săi.
- +
-Interfețe:+
  
 <code java> <code java>
Line 219: Line 163:
 </​code>​ </​code>​
  
-Clasa auxiliară **Pair**:+Clasele **Assistant** și **Teacher** vor implementa interfața Element, iar clasa 
 +**ScoreVisitor** va implementa interfața Visitor. În clasa ScoreVisitor vom avea 
 +două dicționare în care sunt stocate notele studenților pentru examene și pentru parcurs. 
 +  ​Dicționarul ​**examScores** va avea cheia de tip Teacher și valoare de tip listă de Pair (Student, Numele cursului – ca String, nota pe care a acordat-o studentului pentru cursul indicat – ca Double). 
 +  ​Dicționarul ​**partialScores** cu semnificație similară, dar pentru notele de pe parcurs atribuite de asistenți.
  
 <code java> <code java>
Line 237: Line 185:
     public V2 getValue2() { return value2; }     public V2 getValue2() { return value2; }
 } }
-</​code>​ 
  
-Clasa **ScoreVisitor**:​ 
- 
-<code java> 
 public class ScoreVisitor implements Visitor { public class ScoreVisitor implements Visitor {
     private HashMap<​Teacher,​ ArrayList<​Pair<​Student,​ String, Double>>>​ examScores;     private HashMap<​Teacher,​ ArrayList<​Pair<​Student,​ String, Double>>>​ examScores;
Line 254: Line 198:
  
     public void visit(Assistant assistant) {     public void visit(Assistant assistant) {
-        // TODO1 - completați notele de pe parcurs+        // TODO1
     }     }
  
     public void visit(Teacher teacher) {     public void visit(Teacher teacher) {
-        // TODO2 - completați notele de la examen+        // TODO2
     }     }
 } }
 </​code>​ </​code>​
  
-Cerințde implementare:​+  * **TODO1** – veți determina toate notele pe care le are de trecut asistentul primit ca parametru de metoda respectivă. Veți verifica dacă pentru o intrare din lista de note există sau nu un obiect de tip Grade pentru cursul indicat corespunzător studentului. Dacă există, atunci se va seta nota de pe parcurs pentru acel obiect, dacă nu există, se va crea un nou obiect Grade și se va adăuga cursului. 
 +  * **TODO2** – veți determina toate notele pe care le are de trecut profesorul primit ca parametru de metoda respectivă. Veți verifica dacă pentru o intrare din lista de note există sau nu un obiect de tip Grade pentru cursul indicat corespunzător studentului. Dacă există, atunci se va seta nota de la examen pentru acel obiect, dacă nu există, se va crea un nou obiect Grade și se va adăuga cursului.
  
-  * **Assistant** ș**Teacher** implementează **Element**;​ +Hint! Vețadăuga metodele de care aveți nevoie în clasele utilizate. 
-  * **ScoreVisitor** implementează **Visitor**;​ +Exemple: În Catalog veți adăuga ​o metodă //public Course ​getCourse(String name)//care 
-  * **TODO1**: Determinați toate notele pe care le are de trecut asistentul. Verificați dacă există un obiect Grade pentru cursul și studentul respectivDacă există, setați nota de pe parcurs; dacă nu, creați un nou Grade și adăugați-l cursului; +întoarce obiectul Course ​corespunzător ​numelui trimis ca parametru. 
-  * **TODO2**: Similar pentru profesor, dar pentru nota de la examen; +În Course o metodă //​addGrade(Grade g);//. Etc.
-  * Adăugați în **Catalog** metoda ​//​getCourse(String name)// care returnează cursul ​corespunzător; +
-  * Adăugați în **Course** metoda ​//​addGrade(Grade g)//.+
  
-Exemplu de utilizare Visitor:+=== Clasa Test (pentru testare) ===
  
 <code java> <code java>
-HashMap<​Teacher,​ ArrayList<​Pair<​Student, ​StringDouble>>>​ examScores ​new HashMap<>​(); +class Test { 
-ArrayList<​Pair<​Student, ​StringDouble>>​ ar1 new ArrayList<>​(); +    public static void main(String[] args) { 
-ar1.add(new Pair(studentA, "POO", ​3.6d)); +        //testare exercitiu 2 
-examScores.put((Teacher) ​teacherar1);+        User studentA = UserFactory.createUser("​Student""​A"​"​Popescu"​);​ 
 +        User studentB ​UserFactory.createUser("​Student",​ "​B",​ "​Ionescu"​); 
 +        User studentC = UserFactory.createUser("​Student""​C"​"​Ionescu"​);​ 
 +        User mother ​UserFactory.createUser("​Parent",​ "​M_AC",​ "​Ionescu"​); 
 +        User father = UserFactory.createUser("​Parent"​, "T_AC", ​"​Ionescu"​); 
 +        User teacher = UserFactory.createUser("Teacher", "​Teacher",​ "​Georgescu"​)
 +        User assistant = UserFactory.createUser("​Assistant"​"​Assistant",​ "​Popescu"​);
  
-HashMap<​Assistant,​ ArrayList<​Pair<​Student,​ String, Double>>>​ partialScores ​= new HashMap<>​(); +        //testare exercitiu 3+5 
-ArrayList<​Pair<​Student, ​StringDouble>>​ ar2 = new ArrayList<>​(); +        Course course ​= new Course.CourseBuilder("​POO"​).teacher((Teacher) teacher
-ar2.add(new Pair(studentC, ​"​POO", ​4.6d)); +                ​.assistant((Assistant) assistant).grade(new Grade("​POO",​ (Student) studentA4d,5d)
-partialScores.put((Assistantassistant, ar2);+                .grade(new Grade("​POO", ​(Student) studentB,​3d,​3d)).strategy(new BestExamScore()).build(); 
 +        ​System.out.println("Curs: "+ course); 
 +        System.out.println("​Best Student:"​ + course.getBestStudent());
  
-Visitor v new ScoreVisitor(examScores,​ partialScores);​ +        //testare exercitiu 1+3+5 
-v.visit((Teacher) teacher); +        Catalog catalog ​Catalog.getInstance(); 
-v.visit((Assistant) assistant); +        ​catalog.addCourse(course);
-</​code>​+
  
-=== Breviar - Builder Pattern ​(din documentație===+        //testare exercitiu 4 
 +        ​((Student) studentB).setMother((Parent) mother); 
 +        ((Student) studentB).setFather((Parent) father); 
 +        ((Student) studentC).setMother((Parent) mother); 
 +        catalog.addObserver((Parent) mother); 
 +        catalog.addObserver((Parent) father); 
 +        catalog.notifyObservers(new Grade("​POO",​ (Student)studentB,​2.5d,​3d));
  
-Exemplu complet de Builder pentru clasa User:+        //testare exercitiu 6 
 +        HashMap<​Teacher,​ ArrayList<​Pair<​Student,​ String, Double>>>​ examScores=new HashMap<>​();​ 
 +        ArrayList<​Pair<​Student,​ String, Double>>​ ar1=new ArrayList<>​();​ 
 +        ar1.add(new Pair(studentA,"​POO",​3.6d));​ 
 +        examScores.put((Teacher)teacher,​ar1);​
  
-<code java> +        HashMap<Assistant, ArrayList<​Pair<​Student, ​String, Double>>>​ partialScores= new HashMap<>​()
-public class User { +        ​ArrayList<​Pair<​Student, ​String, Double>>​ ar2=new ArrayList<>​()
-    private final String ​firstName // required +        ​ar2.add(new Pair(studentC,"​POO",​4.6d))
-    ​private final String ​lastName  // required +        ​partialScores.put((Assistant)assistant,​ar2);
-    ​private int age                // optional +
-    ​private String phone; ​           // optional +
-    private String address         // optional+
  
-    private User(UserBuilder builder) { +        Visitor v=new ScoreVisitor(examScores,partialScores); 
-        this.firstName ​builder.firstName;​ +        ​v.visit((Teacher)teacher); 
-        this.lastName = builder.lastName;​ +        ​System.out.println("Actualizare teacher:" ​+ catalog); 
-        this.age = builder.age;​ +        v.visit((Assistant)assistant); 
-        this.phone = builder.phone;​ +        ​System.out.println("Actualizare assistant:" ​+ catalog);
-        this.address = builder.address;​ +
-    } +
- +
-    public static class UserBuilder { +
-        private final String firstName;​ +
-        private final String lastName; +
-        private int age; +
-        private String phone; +
-        private String address; +
- +
-        public UserBuilder(String firstNameString lastName+
-            this.firstName = firstName;​ +
-            this.lastName = lastName+
-        ​+
- +
-        public UserBuilder age(int age) { +
-            this.age = age; +
-            return this; +
-        } +
- +
-        public UserBuilder phone(String phone) { +
-            this.phone = phone; +
-            return this; +
-        } +
- +
-        public UserBuilder address(String address+
-            this.address = address; +
-            return this; +
-        } +
- +
-        public User build() { +
-            return new User(this); +
-        ​+
-    } +
- +
-    public static void main(String[] args) { +
-        User user1 = new User.UserBuilder("Lokesh",​ "Gupta") +
-                .age(30) +
-                .phone("​1234567"​) +
-                .address("​Fake address 1234"​) +
-                .build(); +
- +
-        ​User user2 = new User.UserBuilder("​Jack",​ "​Reacher"​) +
-                ​.age(40) +
-                .phone("5655"+
-                //no address +
-                .build();+
     }     }
 } }
 </​code>​ </​code>​
- 
  
poo/laboratoare/11.1765725770.txt.gz · Last modified: 2025/12/14 17:22 by george.tudor1906
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0