This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:design-patterns [2024/11/20 14:19] bogdan.rusu1707 [Exerciții] |
poo-ca-cd:laboratoare:design-patterns [2024/11/20 14:42] (current) bogdan.rusu1707 [Exerciții] |
||
---|---|---|---|
Line 628: | Line 628: | ||
**Task 1 - Observer, Strategy, Factory (8p) ** | **Task 1 - Observer, Strategy, Factory (8p) ** | ||
- | **Part 1. (4p) - `Strategy, Factory` ** | + | **Part 1. (4p) - Strategy, Factory ** |
În cadrul acestui exercițiu, dorim să implementăm un magazin, ce are disponibile mai multe modalități de plată pentru clienții săi: | În cadrul acestui exercițiu, dorim să implementăm un magazin, ce are disponibile mai multe modalități de plată pentru clienții săi: | ||
- | - folosind un voucher | + | * folosind un voucher |
- | - IBAN-ul | + | * IBAN-ul |
- | - un card pe care îl posedă | + | * un card pe care îl posedă |
- | Cele 3 modalități de plată sunt reprezentate de clase ce implementează interfața `PaymentStrategy`. | + | Cele 3 modalități de plată sunt reprezentate de clase ce implementează interfața **PaymentStrategy**. |
Trebuie să implementați: | Trebuie să implementați: | ||
- | Metoda `pay` din cadrul fiecărei metode de plată. | + | * metoda **pay** din cadrul fiecărei metode de plată. |
- | Metoda `getPaymentMethod,` ce primește un client ca parametru și instanțiază o tranzacție folosind o anumită metodă de plată, aleasă random. | + | * metoda **getPaymentMethod**, ce primește un client ca parametru și instanțiază o tranzacție folosind o anumită metodă de plată, aleasă random. |
- | **Part 2. (4p) - `Observer` ** | + | **Part 2. (4p) - Observer ** |
- | În acest context, `subscriber-ul/observer-ul` este clasa Person. Această clasă implementează interfața `BalanceObserver`. Clasa Shop, care este `subiectul/publisher-ul` care trebuie să implementeze interfața `TransactionPublisher` va avea rolul de a `notifica` un client când o tranzacție este efectuată. | + | În acest context, **subscriber-ul/observer-ul** este clasa Person. Această clasă implementează interfața **BalanceObserver**. Clasa Shop, care este **subiectul/publisher-ul** care trebuie să implementeze interfața **TransactionPublisher** va avea rolul de a **notifica** un client când o tranzacție este efectuată. |
Trebuie să implementați: | Trebuie să implementați: | ||
- | + | * metoda **update** din cadrul clasei **Person**, ce preia notificarea faptului că un client are în cont mai puțini Lei decât o anumită limită, specifică fiecărui client în parte, printr-un mesaj adecvat (”$nume$ $prenume$, ramai fara bani, saracule!”); | |
- | Metoda `update` din cadrul clasei `Person`, ce preia notificarea faptului că un client are în cont mai puțini Lei decât o anumită limită, specifică fiecărui client în parte, printr-un mesaj adecvat (”$nume$ $prenume$, ramai fara bani, saracule!”). | + | * metoda **payBy** din cadrul clasei Person, ce întoarce valoarea de adevăr a reușitei efectuării unei plăți (dacă e posibil, efectuează plata), iar în caz negativ afisează și un mesaj adecvat (”$nume$ $prenume$, pleaca de aici, saracule!”); |
- | Metoda `payBy` din cadrul clasei Person, ce întoarce valoarea de adevăr a reușitei efectuării unei plăți (dacă e posibil efectuează plata), iar în caz negativ afisează și un mesaj adecvat (”$nume$ $prenume$, pleaca de aici, saracule!”). | + | * metoda **createTransaction** din cadrul clasei **Shop**, ce verifică dacă trebuie notificată persoana cu ajutorul metodei **update**, în urma unei tranzacții. |
- | Metoda `createTransaction` din cadrul clasei Shop, ce verifică dacă trebuie notificată persoana cu ajutorul metodei `update`, în urma unei tranzacții. | + | |
Line 658: | Line 657: | ||
**Task 2 - Builder pattern (2p)** | **Task 2 - Builder pattern (2p)** | ||
- | `Builder pattern` (2p) | ||
- | a) Examinați câmpurile din skeletul clasei `House` care includ câteva facilități obligatorii în construcția unei case, spre exemplu: | + | a) Examinați câmpurile din skeletul clasei **House** care includ câteva facilități obligatorii în construcția unei case, spre exemplu: |
- | * `locația construcției` | + | * locația construcției |
- | * `numărul de etaje` | + | * numărul de etaje |
- | * `camere` | + | * camere |
- | * unele `opționale` pe care le poate selecta sau nu clientul, cum ar fi: | + | * unele **opționale** pe care le poate selecta sau nu clientul, cum ar fi: |
- | * `electrocasnice` | + | * electrocasnice |
- | * `piscină` | + | * piscină |
- | * `panouri solare` | + | * panouri solare |
- | * `securitate` | + | * securitate |
Completați constructorul public și metoda toString. | Completați constructorul public și metoda toString. | ||
- | b) În clasa de builder, completați câmpurile, constructorul și metodele de adăugare a facilităților opționale. | + | b) În clasa **HouseBuilder**, completați câmpurile, constructorul și metodele de adăugare a facilităților opționale. |
c) Finalizați metoda build și decomentați codul din Main pentru a putea testa corectitudinea funcționalității. | c) Finalizați metoda build și decomentați codul din Main pentru a putea testa corectitudinea funcționalității. | ||
Line 688: | Line 686: | ||
* //Client// - entry-point-ul în program | * //Client// - entry-point-ul în program | ||
- | (4p) Implementați 5 tipuri de comenzi, pentru următoarele acțiuni: | + | (4p) Implementați 4 tipuri de comenzi, pentru următoarele acțiuni: |
* Draw rectangle - crează o DiagramComponent și o adaugă în DiagramCanvas | * Draw rectangle - crează o DiagramComponent și o adaugă în DiagramCanvas | ||
* Resize - modifică width și height al unei DiagramComponent pe baza unui procent dat | * Resize - modifică width și height al unei DiagramComponent pe baza unui procent dat |