Exercițiu
Implementați un sistem simplificat de urmărire a comenzilor pentru un magazin online. O comandă trece prin mai multe stări: Plasata, Procesata, Expediata, Livrata. La fiecare tranziție, sistemul notifică automat clientul prin mai multe canale. Costul de livrare se calculează după strategii diferite, configurabile la runtime.
Structura de bază
Definiți enumerația StareComanda cu valorile: Plasata, Procesata, Expediata, Livrata.
Definiți clasa Produs cu proprietățile:
string Numedecimal Pretint Cantitate
Definiți clasa Comanda cu proprietățile readonly, setate la constructor:
string NumarComanda, generat automat în constructor, de formaCMD-001,CMD-002etc.string NumeClientstring EmailClientList<Produs> Produse, inițializată în constructor cu o listă goalăStareComanda Stare, inițializată cuPlasata- poate fi setată și din exteriorul claseiDateTime DataPlasare, setată automat în constructor cuDateTime.Now
Adăugați metodele:
decimal GetValoareTotala(), sumaPret * Cantitatepentru toate produselevoid AdaugaProdus(Produs p), adaugă un produs în listăoverride string ToString(), returnează un șir cu numărul comenzii, clientul și valoarea totală
Delegat și notificări multicast
Declarați un delegat numit NotificareClient care primește doi parametri (string numarComanda, string mesaj) și nu returnează nimic.
Implementați în clasa statică NotificareService trei metode statice compatibile cu acest delegat:
NotificaPrinEmail(string numarComanda, string mesaj)— afișează prefixat cu[EMAIL]NotificaPrinSMS(string numarComanda, string mesaj)— afișează prefixat cu[SMS]Log(string numarComanda, string mesaj)— afișează prefixat cu[LOG]
Demonstrați în Main:
Crearea unui delegat multicast care include toate trei metodele
Invocarea lui cu un mesaj de test
Eliminarea
NotificareSMScu-=și demonstrarea că nu mai este apelată
Action
Action Refactorizați sistemul de notificări pentru a folosi Action<string, string> în loc de delegatul NotificareClient. Adăugați și o notificare push scrisă direct ca lambda la momentul abonării.
Clasa Depozit cu evenimente
Depozit cu evenimenteDefiniți clasa Depozit care procesează comenzi și gestionează tranzițiile de stare.
Clasele EventArgs:
ComandaSchimbatStareEventArgs — derivată din EventArgs, conține:
Comanda ComandaStareComanda StareVecheStareComanda StareNoua
ComandaLivrataEventArgs — derivată din EventArgs, conține:
Comanda ComandaDateTime DataLivrare
Proprietăți și evenimente în Depozit:
string NumeDepozitevent EventHandler<ComandaSchimbatStareEventArgs> ComandaSchimbatStareevent EventHandler<ComandaLivrataEventArgs> ComandaLivrata
Metode:
InregistreazaComanda(Comanda c, NotificareClient onNotificareClient = null) adaugă comanda în colecția internă privată și notifică clientul prin intermediul unui delegat
AvansezaStare(string numarComanda) — găsește comanda după număr, avansează starea la următoarea valoare din enumerație și declanșează ComandaSchimbatStare; dacă noua stare este Livrata, declanșează și ComandaLivrata
GetComenziActive() — returnează comenzile care nu au starea Livrata
Abonare la evenimente
În Main, creați un Depozit, înregistrați cel puțin 3 comenzi și abonați-vă la ambele evenimente.
Avansați fiecare comandă prin toate stările apelând AvansezaStare în buclă și observați că:
ComandaSchimbatStarese declanșează la fiecare tranzițieComandaLivratase declanșează doar la starea finală
Last updated