User Tools

Site Tools


Problem constructing authldap
arhiva:laboratoare:2013:lab11
Differences

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

Link to this comparison view

Next revision
Previous revision
arhiva:laboratoare:2013:lab11 [2014/10/27 19:23]
Adriana Draghici created
arhiva:laboratoare:2013:lab11 [2014/12/05 14:27] (current)
Adriana Draghici
Line 13: Line 13:
 == Introducere == == Introducere ==
  
-În laboratorul [[laboratoare:​visitor|Visitor Pattern]] au fost introduse design pattern-urile și aplicabilitatea Visitor-ului. Acesta este un pattern comportamental,​ și după cum ați observat oferă avantaje în anumite situații, în timp ce pentru altele nu este potrivit. Pattern-urile comportamentale modelează interacțiunile dintre clasele și componentele unei aplicații, fiind folosite în cazurile în care vrem sa facem un design mai clar și ușor de adaptat și extins. În afară de acest tip de pattern-uri,​ mai se folosesc și cele //​structural//​ și //​creational//,​ prezentate în clasificarea următoare:+În laboratorul [[lab10|Visitor Pattern]] au fost introduse design pattern-urile și aplicabilitatea Visitor-ului. Acesta este un pattern comportamental,​ și după cum ați observat oferă avantaje în anumite situații, în timp ce pentru altele nu este potrivit. Pattern-urile comportamentale modelează interacțiunile dintre clasele și componentele unei aplicații, fiind folosite în cazurile în care vrem sa facem un design mai clar și ușor de adaptat și extins. În afară de acest tip de pattern-uri,​ mai se folosesc și cele //​structural//​ și //​creational//,​ prezentate în clasificarea următoare:
  
 * //​Creational Patterns// - mecanisme de creare a obiectelor * //​Creational Patterns// - mecanisme de creare a obiectelor
Line 43: Line 43:
 În cazul unei implementări Singleton, clasa respectivă va fi instanțiată **lazy** (//lazy instantiation//​),​ utilizând memoria doar în momentul în care acest lucru este necesar deoarece instanța se creează atunci când se apelează ''​getInstance()'',​ acest lucru putând fi un avantaj în unele cazuri, față de clasele non-singleton,​ pentru care se face //eager instantiation//,​ deci se alocă memorie încă de la început, chiar dacă instanța nu va fi folosită (mai multe detalii și exemplu în [[http://​www.javaworld.com/​article/​2077568/​learn-java/​java-tip-67--lazy-instantiation.html |acest articol]]) În cazul unei implementări Singleton, clasa respectivă va fi instanțiată **lazy** (//lazy instantiation//​),​ utilizând memoria doar în momentul în care acest lucru este necesar deoarece instanța se creează atunci când se apelează ''​getInstance()'',​ acest lucru putând fi un avantaj în unele cazuri, față de clasele non-singleton,​ pentru care se face //eager instantiation//,​ deci se alocă memorie încă de la început, chiar dacă instanța nu va fi folosită (mai multe detalii și exemplu în [[http://​www.javaworld.com/​article/​2077568/​learn-java/​java-tip-67--lazy-instantiation.html |acest articol]])
  
-<​imgcaption image_singleton|Diagrama de clase pentru Singleton>​{{ ​:​laboratoare:​lab11:​singletonclassdiagram.png |}}</​imgcaption>​+<​imgcaption image_singleton|Diagrama de clase pentru Singleton>​{{ ​.:​lab11:​singletonclassdiagram.png |}}</​imgcaption>​
  
  
Line 108: Line 108:
 === Abstract Factory Pattern === === Abstract Factory Pattern ===
  
-<​imgcaption af_image|Diagrama de clase pentru Abstract Factory>​{{ ​:​laboratoare:​lab11:​abstractfactory.png |}}</​imgcaption>​+<​imgcaption af_image|Diagrama de clase pentru Abstract Factory>​{{ ​.:​lab11:​abstractfactory.png |}}</​imgcaption>​
  
 Codul următor corespunde diagramei din <imgref af_image>​. În acest caz folosim interfețe pentru factory și pentru tip, însă în alte situații putem să avem direct //​SpecializedFooFactory,//​ fără a implementa interfața //​FooFactory//​. ​ Codul următor corespunde diagramei din <imgref af_image>​. În acest caz folosim interfețe pentru factory și pentru tip, însă în alte situații putem să avem direct //​SpecializedFooFactory,//​ fără a implementa interfața //​FooFactory//​. ​
Line 138: Line 138:
 Spre deosebire de Abstract Factory, Factory Method ascunde construcția unui obiect, nu a unei familii de obiecte "​inrudite",​ care extind un anumit tip. Clasele care implementează Abstract Factory conțin de obicei mai multe metode factory. Spre deosebire de Abstract Factory, Factory Method ascunde construcția unui obiect, nu a unei familii de obiecte "​inrudite",​ care extind un anumit tip. Clasele care implementează Abstract Factory conțin de obicei mai multe metode factory.
  
-<​imgcaption fm_image|Diagrama de clase pentru Factory Method>​{{ ​:​laboratoare:​lab11:​factorymethod.png?​510 |}}</​imgcaption>​+<​imgcaption fm_image|Diagrama de clase pentru Factory Method>​{{ ​.:​lab11:​factorymethod.png?​510 |}}</​imgcaption>​
  
 === Exemplu === === Exemplu ===
Line 221: Line 221:
     * subiectul poate adăuga noi observatori     * subiectul poate adăuga noi observatori
  
-<​imgcaption obs_image|Diagrama de clase pentru Observer Pattern>​{{:​laboratoare:​lab11:​observer.png|}}</​imgcaption>​+<​imgcaption obs_image|Diagrama de clase pentru Observer Pattern>​{{ ​.:​lab11:​observer.png|}}</​imgcaption>​
  
 **Subiect** **Subiect**
Line 244: Line 244:
 === Implementare === === Implementare ===
  
-Un exemplu de implementare este [[.:clase-interne#​exercitii|exercitiul 2]] de la laboratorul ​ 6 (Clase interne). Urmăriți soluția acestuia și diagrama de clase pentru acesta.+Un exemplu de implementare este [[.:lab6#​exercitii|exercitiul 2]] de la laboratorul ​ 6 (Clase interne). Urmăriți soluția acestuia și diagrama de clase pentru acesta.
  
 Tookit-urile GUI, cum este și [[http://​en.wikipedia.org/​wiki/​Swing_%28Java%29|Swing]] folosesc acest design pattern, de exemplu apăsarea unui buton generează un eveniment ce poate fi transmis mai multor //​listeners//​ înregistrați acestuia ([[http://​www.programcreek.com/​2009/​01/​the-steps-involved-in-building-a-swing-gui-application/​|exemplu]]). Tookit-urile GUI, cum este și [[http://​en.wikipedia.org/​wiki/​Swing_%28Java%29|Swing]] folosesc acest design pattern, de exemplu apăsarea unui buton generează un eveniment ce poate fi transmis mai multor //​listeners//​ înregistrați acestuia ([[http://​www.programcreek.com/​2009/​01/​the-steps-involved-in-building-a-swing-gui-application/​|exemplu]]).
Line 269: Line 269:
 Ideea principală este de a crea un obiect de tip //Command// care va reține parametrii pentru comandă. Comandantul reține o referință la comandă și nu la componenta comandată. Comanda propriu-zisă este anunțată obiectului //Command// (de către comandant) prin execuția unei metode specificate asupra lui. Obiectul //Command// este apoi responsabil de trimiterea (//​dispatch//​) comenzii către obiectele care o îndeplinesc (//​comandați//​). ​ Ideea principală este de a crea un obiect de tip //Command// care va reține parametrii pentru comandă. Comandantul reține o referință la comandă și nu la componenta comandată. Comanda propriu-zisă este anunțată obiectului //Command// (de către comandant) prin execuția unei metode specificate asupra lui. Obiectul //Command// este apoi responsabil de trimiterea (//​dispatch//​) comenzii către obiectele care o îndeplinesc (//​comandați//​). ​
  
-<​imgcaption cmd_image|Diagrama de stări pentru CommandPattern>​{{ ​:​laboratoare:​lab11:​command.png |}}</​imgcaption>​+<​imgcaption cmd_image|Diagrama de stări pentru CommandPattern>​{{ ​.:​lab11:​command.png |}}</​imgcaption>​
   ​   ​
  ​Tipuri de componente (**roluri**): ​  ​Tipuri de componente (**roluri**): ​
Line 293: Line 293:
 Diagrama de secvență din <imgref cmd_flow_image>​ prezintă apelurile în cadrul unei aplicație de editare a imaginilor, ce este structurată folosind pattern-ul Command. În cadrul acesteia, Receiver-ul este //Image//, iar comenzile //​BlurCommand//​ și //​CropCommand//​ modifică starea acesteia. Structurând aplicația în felul acesta, este foarte ușor de implementat un mecanism de undo/redo, fiind suficient să menținem în Invoker o listă cu obiectele de tip //Command// aplicate imaginii. ​ Diagrama de secvență din <imgref cmd_flow_image>​ prezintă apelurile în cadrul unei aplicație de editare a imaginilor, ce este structurată folosind pattern-ul Command. În cadrul acesteia, Receiver-ul este //Image//, iar comenzile //​BlurCommand//​ și //​CropCommand//​ modifică starea acesteia. Structurând aplicația în felul acesta, este foarte ușor de implementat un mecanism de undo/redo, fiind suficient să menținem în Invoker o listă cu obiectele de tip //Command// aplicate imaginii. ​
  
-<​imgcaption cmd_flow_image|Diagrama de secvență pentru comenzile de prelucrare a imaginilor>​{{ ​:​laboratoare:​lab11:​command_image_sequence.png |}}</​imgcaption>​+<​imgcaption cmd_flow_image|Diagrama de secvență pentru comenzile de prelucrare a imaginilor>​{{ ​.:​lab11:​command_image_sequence.png |}}</​imgcaption>​
  
 Pe [[http://​en.wikipedia.org/​wiki/​Command_pattern | wikipedia]] puteți analiza exemplul PressSwitch. Flow-ul pentru acesta este ilustrat în <imgref cmd_flow_image2>​ Pe [[http://​en.wikipedia.org/​wiki/​Command_pattern | wikipedia]] puteți analiza exemplul PressSwitch. Flow-ul pentru acesta este ilustrat în <imgref cmd_flow_image2>​
-<​imgcaption cmd_flow_image2|Diagrama de secvență pentru comenzile de aprindere/​stingere a switch-ului>​{{ ​:​laboratoare:​lab11:​command_switch_sequence.png | }}</​imgcaption>​+<​imgcaption cmd_flow_image2|Diagrama de secvență pentru comenzile de aprindere/​stingere a switch-ului>​{{ ​.:​lab11:​command_switch_sequence.png | }}</​imgcaption>​
  
  
Line 348: Line 348:
 == Resurse == == Resurse ==
  
-* {{.:​lab11:​design-patterns-skel.zip|Schelet}} +* {{ .:lab11::​design-patterns-skel.zip|Schelet}} 
-* {{.:​lab11:​design-patterns-sol.zip|Soluții}}+* {{ .:lab11::​design-patterns-sol.zip|Soluții}}
 * <​html><​a class="​media mediafile mf_pdf"​ href="/​poo/​arhiva/​laboratoare/​2013/​lab11?​do=export_pdf">​PDF laborator</​a></​html>​ * <​html><​a class="​media mediafile mf_pdf"​ href="/​poo/​arhiva/​laboratoare/​2013/​lab11?​do=export_pdf">​PDF laborator</​a></​html>​
  
arhiva/laboratoare/2013/lab11.1414430636.txt.gz · Last modified: 2014/10/27 19:23 by Adriana Draghici