This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
laboratoare:design-patterns [2019/12/09 11:25] Adriana Draghici |
laboratoare:design-patterns [2020/01/04 21:54] (current) Adriana Draghici [Resurse] added solution |
||
---|---|---|---|
Line 207: | Line 207: | ||
//__Recomandare__//: Urmariti link-ul de la referinte catre postul de pe Stack Overflow care descrie necesitatea pattern-ului Strategy. Pe langa motivul evident de incapsulare a prelucrarilor/algoritmilor (care reprezinta strategiile efective), se prefera o anumita abordare: la runtime se verifica mai multe conditii si se decide asupra strategiei. Concret, folosind mecanismul de polimorfism dinamic, se foloseste o anumita instanta a tipului de strategie (//ex. Strategy str = new CustomStrategy//), care se paseaza in toate locurile unde este nevoie de Strategy. Practic, in acest fel, utilizatorii unei anumite strategii vor deveni agnostici in raport cu strategia utilizata, ea fiind instantiata intr-un loc anterior si putand fi gata utilizata. Ganditi-va la browserele care trebuie sa detecteze daca device-ul este PC, smartphone, tableta sau altceva si in functie de acest lucru sa randeze in mod diferit. Fiecare randare poate fi implementata ca o strategie, iar instantierea strategiei se va face intr-un punct, fiind mai apoi pasata in toate locurile unde ar trebui sa se tina cont de aceasta strategie. | //__Recomandare__//: Urmariti link-ul de la referinte catre postul de pe Stack Overflow care descrie necesitatea pattern-ului Strategy. Pe langa motivul evident de incapsulare a prelucrarilor/algoritmilor (care reprezinta strategiile efective), se prefera o anumita abordare: la runtime se verifica mai multe conditii si se decide asupra strategiei. Concret, folosind mecanismul de polimorfism dinamic, se foloseste o anumita instanta a tipului de strategie (//ex. Strategy str = new CustomStrategy//), care se paseaza in toate locurile unde este nevoie de Strategy. Practic, in acest fel, utilizatorii unei anumite strategii vor deveni agnostici in raport cu strategia utilizata, ea fiind instantiata intr-un loc anterior si putand fi gata utilizata. Ganditi-va la browserele care trebuie sa detecteze daca device-ul este PC, smartphone, tableta sau altceva si in functie de acest lucru sa randeze in mod diferit. Fiecare randare poate fi implementata ca o strategie, iar instantierea strategiei se va face intr-un punct, fiind mai apoi pasata in toate locurile unde ar trebui sa se tina cont de aceasta strategie. | ||
+ | == Summary == | ||
+ | * Principii de design adresate de aceste patternuri: | ||
+ | * [[https://stackoverflow.com/questions/62539/what-is-the-dependency-inversion-principle-and-why-is-it-important|Dependency Injection Principle]] - componentele trebuie să depindă de tipuri abstracte, nu de implementări | ||
+ | * Factory respectă acest principiu, componentele depinzând de interfața pentru un tip, nu de un subtip anume | ||
+ | * Separarea codului care se schimbă de cel care rămâne la fel - în cazul Strategy folosim o interfață pentru strategii, depindem de aceea, si putem schimba implementările fără a modifica codul care le folosește ([[https://www.freecodecamp.org/news/the-strategy-pattern-explained-using-java-bc30542204e0/|exemplu]]) | ||
+ | * [[http://thephantomprogrammer.blogspot.com/2015/07/strive-for-loosely-coupled-design.html|Loosly coupled design]] - în cazul Observer componentele sunt slab legate între ele | ||
Line 254: | Line 259: | ||
== Resurse == | == Resurse == | ||
- | * {{ :laboratoare:design-patterns:design-patterns-part1-skel.zip |Schelet laborator}} | + | * {{ :laboratoare:design-patterns:design-patterns-part1-skel.zip |Schelet}} |
+ | * {{ :laboratoare:design-patterns:lab-design-patterns1-sol.zip | Soluție}} | ||
* [[laboratoare:old-exercises|Exerciții din alți ani]] | * [[laboratoare:old-exercises|Exerciții din alți ani]] | ||