Differences

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

Link to this comparison view

poo:laboratoare:12 [2017/10/30 20:59]
127.0.0.1 external edit
poo:laboratoare:12 [2026/01/12 07:49] (current)
george.tudor1906
Line 1: Line 1:
-===== Laboratorul 12. ===== 
  
 +===== Laboratorul 12 – Genericitate. Design Patterns 2 =====
 +
 +{{:​poo:​laboratoare:​arhiva12_genericitate_dp2.zip|Arhiva laborator}}
 +
 +=== Problema 1 ===
 +
 +Pornind de la codul de mai jos, asigurați faptul că se va apela codul aferent tipului
 +dinamic al parametrului,​ definind clasele Hero, Warrior, Ninja, Rogue și StormFire,
 +în mod minimal!
 +
 +<code java>
 +public class Binding {
 +    public static void main(String args[]) {
 +        Hero h1 = new Warrior(), h2 = new Ninja();
 +        Hero h3 = new Rogue();
 +        BadLuck bl = new StormFire();​
 +        bl.execute(h1);​
 +        bl.execute(h2);​
 +        bl.execute(h3);​
 +    }
 +}
 +
 +abstract class BadLuck {
 +    abstract void execute(Hero h);
 +    abstract void execute(Warrior w);
 +    abstract void execute(Ninja n);
 +    abstract void execute(Rogue r);
 +}
 +</​code>​
 +
 +Clasele Hero și BadLuck sunt clase abstracte!
 +
 +=== Problema 2 - Decorator ===
 +
 +Folosind **design pattern-ul Decorator**,​ implementați clasele și interfețele necesare
 +pentru a putea construi un obiect de tip **IceCream** ce conține două toppinguri:
 +**Chocolate** și **Vanilla**. Afișați prețul și descrierea acestei înghețate.
 +
 +În constructorul fiecărui topping, respectiv în constructorul **BasicIceCream** se va
 +afișa un mesaj prin care se specifică ce se adaugă.
 +
 +Prețuri: basicIceCream 0.5, ciocolată 1.5, vanilie 2.
 +
 +Descriere metode:
 +  * **getDescription()**:​ returnează elementele componente ale înghețatei până acum (adică lista tuturor componentelor adăugate anterior plus topping-ul curent);
 +  * **getPrice()**:​ returnează costul curent al înghețatei (suma tuturor elementelor adăugate anterior + costul toppingului curent).
 +
 +<note important>​
 +Pentru a putea adăuga funcționalitate (în cazul de față un topping) unui obiect,
 +vom avea nevoie de o referință către obiectul respectiv în decorator.
 +Un con (obiect de tipul BasicIceCream) fără topping este considerat tot o înghețată!
 +</​note>​
 +
 +<note warning>
 +Pentru a putea adăuga topping-uri avem nevoie de un con!
 +</​note>​
 +
 +**Exemplu output:**
 +<​code>​
 +Adding cone
 +Adding choco
 +Adding vanilla
 +Ingrediente:​ cone, chocolate, vanilla
 +Cost: 4.0
 +</​code>​
 +
 +=== Problema 3 ===
 +
 +Definiți clasa GenericListMethods care să implementeze interfața, pusă la dispoziție
 +în arhiva laboratorului,​ GenericInterface.
 +
 +Această interfață conține operații care prelucrează o listă, cu elemente de tip Comparable.
 +
 +  * Metoda **removeDuplicates** primește ca parametru un obiect de tip ArrayList și transformă lista într-o mulțime, eliminând duplicatele.
 +  * Metoda **max** are ca parametru tot un ArrayList și returnează elementul maxim din listă.
 +  * Metoda **binarySearch** este folosită pentru a determina poziția unei valori într-o listă ordonată, utilizând pentru aceasta algoritmul de căutare binară, detaliat în blocul de cod de mai jos.
 +
 +<code java>
 +int BinarySearch(v,​ start, end, x) {
 +    // condiția de oprire (x nu se află în v)
 +    if (start > end)
 +        return -1;
 +
 +    // etapa divide
 +    int mid = (start + end) / 2;
 +
 +    // etapa stăpânește
 +    if (v[mid] == x)
 +        return mid;
 +    if (v[mid] > x)
 +        return BinarySearch(v,​ start, mid - 1, x);
 +    if (v[mid] < x)
 +        return BinarySearch(v,​ mid + 1, end, x);
 +}
 +</​code>​
 +
 +=== Problema 4 ===
 +
 +Pornind de la clasa abstractă AMatrix, pusă la dispoziție în arhiva laboratorului,​
 +implementați clasa IntegerMatrix care moștenește această clasă abstractă și modelează
 +un tablou bidimensional cu numere întregi.
 +
 +Clasa AMatrix moștenește clasa ArrayList. Astfel, matricea propriu-zisă este un obiect
 +de tip ArrayList care conține elemente de tip ArrayList.
 +
 +Clasa va conține metode pentru următoarele operații: afișarea matricei, adunarea a două
 +matrice, și metoda sum pentru a aduna două elemente!
 +
 +<code java>
 +// afișare
 +public String toString();
 +
 +// sum
 +public Integer sum(Integer obj1, Integer obj2);
 +
 +// adunare
 +public AMatrix addition(AMatrix m);
 +</​code>​
 +
 +Folosiți iteratori pentru parcurgerea colecțiilor sau bucle for each!
 +
 +=== Problema 5 ===
 +
 +Să se definească o clasă generică ArrayMap, pentru un dicționar realizat din doi vectori
 +(un vector de chei și un vector de valori asociate, obiecte din clasa Vector), care să
 +poată înlocui o clasă HashMap sau TreeMap.
 +
 +Astfel, această clasă va extinde clasa AbstractMap,​ suprascriind următoarele metode:
 +
 +<code java>
 +public String toString();
 +public V put(K, V);
 +public V get(Object);​
 +public Set<​K>​ keySet();
 +public Collection<​V>​ values();
 +public Set<​Map.Entry<​K,​ V>> entrySet();
 +// atenție! Se va defini o clasă internă pentru o intrare în dicționar - Map.Entry
 +</​code>​
 +
 +Afișați dicționarul folosind System.out.println(dictionar) și apoi folosind un Iterator
 +pentru a parcurge mulțimea intrărilor generată de metoda entrySet.
  
poo/laboratoare/12.1509389957.txt.gz · Last modified: 2017/12/13 01:48 (external edit)
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