This shows you the differences between two versions of the page.
|
poo:laboratoare:13 [2021/01/17 19:18] carmen.odubasteanu |
poo:laboratoare:13 [2023/12/09 11:42] (current) carmen.odubasteanu |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Laboratorul 13. ===== | + | ===== Laboratorul 11. ===== |
| === Problema 1 - Singleton === | === Problema 1 - Singleton === | ||
| Line 19: | Line 19: | ||
| <code java> | <code java> | ||
| public abstract class User { | public abstract class User { | ||
| - | private String firstName, lastName; | + | protected String firstName, lastName; |
| public User(String firstName, String lastName) { | public User(String firstName, String lastName) { | ||
| this.firstName = firstName; | this.firstName = firstName; | ||
| Line 42: | Line 42: | ||
| User studentC = UserFactory.createUser("Student", "C", "Ionescu"); | User studentC = UserFactory.createUser("Student", "C", "Ionescu"); | ||
| - | User mother = UserFactory.createUser("Parent", "MAC", "Ionescu"); | + | User mother = UserFactory.createUser("Parent", "M_AC", "Ionescu"); |
| - | User father = UserFactory.createUser("Parent", "MAC", "Ionescu"); | + | User father = UserFactory.createUser("Parent", "T_AC", "Ionescu"); |
| User teacher = UserFactory.createUser("Teacher", "Teacher", "Georgescu"); | User teacher = UserFactory.createUser("Teacher", "Teacher", "Georgescu"); | ||
| Line 156: | Line 156: | ||
| <note> | <note> | ||
| Hint! | Hint! | ||
| + | |||
| 1.Parent va tine minte si o lista a notificarilor, iar Catalog o lista a Observatorilor. | 1.Parent va tine minte si o lista a notificarilor, iar Catalog o lista a Observatorilor. | ||
| + | |||
| 2. Atentie! Primesc notificari doar parintii studentului respectiv! Modificati clasa Student astfel incat sa avem memorati si parintii pentru fiecare Student si adaugati o metoda isParent(Observer parent) care verifica daca un observator este parintele studentului current. | 2. Atentie! Primesc notificari doar parintii studentului respectiv! Modificati clasa Student astfel incat sa avem memorati si parintii pentru fiecare Student si adaugati o metoda isParent(Observer parent) care verifica daca un observator este parintele studentului current. | ||
| </note> | </note> | ||
| Line 165: | Line 167: | ||
| Fiecare profesor va aplica o politica prin care la sfârșitul semestrului selecteaza cel mai bun student. Pentru a realiza acest lucru în cadrul implementarii, va trebui sa folosiți șablonul de proiectare **Strategy**. Veți defini câte o clasa pentru fiecare din urmatoarele strategii: | Fiecare profesor va aplica o politica prin care la sfârșitul semestrului selecteaza cel mai bun student. Pentru a realiza acest lucru în cadrul implementarii, va trebui sa folosiți șablonul de proiectare **Strategy**. Veți defini câte o clasa pentru fiecare din urmatoarele strategii: | ||
| - | 1. **BestPartialScore** – aceasta strategie va selecta studentul care are cel mai mare punctaj în timpul semestrului; | + | - 1. **BestPartialScore** – aceasta strategie va selecta studentul care are cel mai mare punctaj în timpul semestrului; |
| - | 2. **BestExamScore** – aceasta strategie va selecta studentul care are cel mai mare punctaj în examen; | + | - 2. **BestExamScore** – aceasta strategie va selecta studentul care are cel mai mare punctaj în examen; |
| - | 3. **BestTotalScore** – aceasta strategie va selecta studentul care are punctajul total maxim. | + | - 3. **BestTotalScore** – aceasta strategie va selecta studentul care are punctajul total maxim. |
| <code java> | <code java> | ||
| Line 196: | Line 198: | ||
| Clasele **Assistant** și **Teacher** vor implementa interfața **Element**, iar clasa **ScoreVisitor** va implementa interfața **Visitor**. | Clasele **Assistant** și **Teacher** vor implementa interfața **Element**, iar clasa **ScoreVisitor** va implementa interfața **Visitor**. | ||
| În clasa **ScoreVisitor** vom avea doua dicționare în care sunt stocate notele studentilor pentru examene și pentru parcurs. | În clasa **ScoreVisitor** vom avea doua dicționare în care sunt stocate notele studentilor pentru examene și pentru parcurs. | ||
| - | • Dicționarul **examScores** va avea cheia de tip **Teacher** și valoare de tip lista de **Pair** **(Student, Numele cursului – ca String, nota pe care a acordat-o studentului pentru cursul indicat – ca Double).** | + | - Dicționarul **examScores** va avea cheia de tip **Teacher** și valoare de tip lista 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 similara, dar pentru notele de pe parcurs atribuite de asistenți. | + | - Dicționarul **partialScores** cu semnificație similara, dar pentru notele de pe parcurs atribuite de asistenți. |
| În continuare, se va prezenta implementarea de la care veți porni pentru aceasta clasa: | În continuare, se va prezenta implementarea de la care veți porni pentru aceasta clasa: | ||
| <code java> | <code java> | ||
| - | public class ScoreVisitor implements Visitor { | + | class Pair<K, V1, V2> { |
| - | private HashMap<Teacher, ArrayList<Pair<Student, String,,! Double>>> examScores; | + | private K key; |
| - | private HashMap<Assistant, ArrayList<Pair<Student, String,,! Double>>> partialScores; | + | private V1 value1; |
| - | private class Pair<K, V1, V2> { | + | private V2 value2; |
| - | private K key; | + | public Pair(K key, V1 value1, V2 value2) { |
| - | private V1 value1; | + | this.key = key; |
| - | private V2 value2; | + | this.value1 = value1; |
| - | public Pair(K key, V1 value1, V2 value2) { | + | this.value2 = value2; |
| - | this.key = key; | + | } |
| - | this.value1 = value1; | + | public K getKey() { |
| - | this.value2 = value2; | + | return key; |
| - | } | + | } |
| - | public K getKey() { | + | public V1 getValue1() { |
| - | return key; | + | return value1; |
| - | } | + | } |
| - | public V1 getValue1() { | + | public V2 getValue2() { |
| - | return value1; | + | return value2; |
| - | } | + | } |
| - | public V2 getValue2() { | + | |
| - | return value2; | + | |
| - | } | + | |
| - | public void visit(Assistant assistant) { | + | |
| - | // TODO1 | + | |
| - | } | + | |
| - | public void visit(Teacher teacher) { | + | |
| - | // TODO2 | + | |
| } | } | ||
| + | public class ScoreVisitor implements Visitor { | ||
| + | private HashMap<Teacher, ArrayList<Pair<Student, String, Double>>> examScores; | ||
| + | private HashMap<Assistant, ArrayList<Pair<Student, String, Double>>> partialScores; | ||
| + | public ScoreVisitor(HashMap<Teacher, ArrayList<Pair<Student, String, Double>>> examScores, HashMap<Assistant, ArrayList<Pair<Student, String, Double>>> partialScores){ | ||
| + | this.examScores=examScores; | ||
| + | this.partialScores=partialScores; | ||
| + | } | ||
| + | public void visit(Assistant assistant) { | ||
| + | // **TODO1** | ||
| + | } | ||
| + | public void visit(Teacher teacher) { | ||
| + | // **TODO2** | ||
| + | } | ||
| } | } | ||
| </code> | </code> | ||
| - | • **TODO1** – veți determina toate notele pe care le are de trecut asistentul primit ca parametru de metoda respectiva. Veți verifica daca pentru o intrare din lista de note exista sau nu un obiect de tip Grade pentru cursul indicat corespunzator studentului. | + | • **TODO1** – veți determina toate notele pe care le are de trecut asistentul primit ca parametru de metoda respectiva. Veți verifica daca pentru o intrare din lista de note exista sau nu un obiect de tip **Grade** pentru cursul indicat corespunzator studentului. |
| - | Daca exista, atunci se va seta nota de pe parcurs pentru acel obiect, daca nu exista, se va crea un nou obiect Grade și se va adauga cursului. | + | Daca exista, atunci se va seta nota de pe parcurs pentru acel obiect, daca nu exista, se va crea un nou obiect **Grade** și se va adauga cursului. |
| - | • **TODO2** – veți determina toate notele pe care le are de trecut profesorul primit ca parametru de metoda respectiva. Veți verifica daca pentru o intrare din lista de note exista sau nu un obiect de tip Grade pentru cursul indicat corespunzator studentului. | + | • **TODO2** – veți determina toate notele pe care le are de trecut profesorul primit ca parametru de metoda respectiva. Veți verifica daca pentru o intrare din lista de note exista sau nu un obiect de tip **Grade** pentru cursul indicat corespunzator studentului. |
| - | Daca exista, atunci se va seta nota de la examen pentru acel obiect, daca nu exista, se va crea un nou obiect Grade și se va adauga cursului. | + | Daca exista, atunci se va seta nota de la examen pentru acel obiect, daca nu exista, se va crea un nou obiect **Grade** și se va adauga cursului. |
| <note>**Hint!** | <note>**Hint!** | ||
| - | Veti adauga metodele de care aveti nevoie in clasele utilizate. Exemple: | + | Veti adauga metodele de care aveti nevoie in clasele utilizate. |
| - | In Catalog veti adauga o metoda public Course getCourse(String name), care intoarce obiectul Course corespunzator numelui trimis ca parametru. | + | |
| - | In Course o metoda addGrade(Grade ); | + | Exemple: |
| + | In **Catalog** veti adauga o metoda public **Course** **getCourse**(**String** name), care intoarce obiectul Course corespunzator numelui trimis ca parametru. | ||
| + | |||
| + | In **Course** o metoda **addGrade**(**Grade** g); | ||
| Etc. | Etc. | ||
| </note> | </note> | ||
| - | <note> Folositi pentru testare main-ul de la Factory! </note> | + | <note> Folositi pentru testare main-ul de la **Factory**! </note> |
| - | + | <hidden>{{:poo:laboratoare:arhiva_13.zip|Arhiva laborator}} | |
| - | {{:poo:laboratoare:arhiva_13.zip|Arhiva laborator}} | + | </hidden> |