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> |