Differences

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

Link to this comparison view

poo:breviare:breviar-13 [2019/01/07 15:27]
carmen.odubasteanu
poo:breviare:breviar-13 [2021/01/17 19:34] (current)
carmen.odubasteanu [Builder]
Line 2: Line 2:
  
  
-===== 1. Design Patterns =====+===== Design Patterns =====
  
  
-==== Decorator ​====+==== Prezentare generala ​====
  
  
-De multe ori in cadrul unei aplicatii apare urmatorul scenariu. Aveti de implementat ​anumita functionalitate ​care trebuie sa poate fi extinsa fara sa stiti in momentul proiectarii in ce mod va fi extinsa. +Un șablon ​de proiectare descrie ​problema ​care se întâlnește în mod repetat în proiectarea programelor și soluția generala ​pentru ​problema respectiva, astfel încât ​sa poata fi utilizata oricând, dar nu în același mod de fiecare dataSoluția ​este exprimata folosind claseși obiecte. 
-De exemplu lucrati la un joc de tipul shooter. Aveti o lista de arme pe care un user le poate achizitiona si utiliza ​pentru ​a-si impusca oponentii. La un moment dat observati ca incasarile din joc incep sa scada o data ce alternativele de pe piata ofera mai multe feature-uri pentru armele lor. Pentru a nu da faliment va trebui sa adaugati niste feature-uri noi armelor voastre, dar trebui sa tineti cont ca orice modificare ​de cod creste fragilitatea si sansa de aparitie a unor bug-uri care initial nu existau +Atât descrierea problemei cât și a soluției sunt abstracte astfel încât ​sa poata fi folosite în multe situații diferite. 
-Rezolvarea ​este foarte simpla: O sa creati o clasa abstracta wrapper peste o instanta de armaDaca de exemplu vreti ca toate armele voastra ​sa poata fi mortale dar silentioase,​ creati clasa WeaponSilencer ce implementeaza interfata ​de baza armelor si are un obiect de tip arma internIn metoda fire, in decorator, o sa setati eventual +Scopul șabloanelor de proiectare este de a asista rezolvarea unor probleme similare cu unele deja întâlniteși rezolvate anteriorEle ajuta la crearea unui limbaj comun pentru comunicarea experienței despre aceste problem și soluțiile lor.
-sunetul jocului mai incet. +
-  +
-{{ :​poo:​breviare:​img1.jpg?600 |}}+
  
-Un alt exemplu la indemana ​sunt fluxurile din java.+Cele 4 elemente cheie care definesc un șablon de proiectare ​sunt urmatoarele:​
  
-''​CipherOutputStream cos = new CipherOutputStream(new FileOutputStream( "​file"​ ) c );''​+1. Numele șablonului de proiectare – având în vedere ca exista multe tipuri de șabloane de proiectareeste important ca fiecaruia sa îi fie aplicat un nume sugestiv, în strânsa legatura cu problema pe care o rezolva, care sa permita identificarea rapida a acestuia și a documentației aferente.
  
-''​PrintWriter pw = new PrintWriter (new OutputStreamWriter ( cos ) );''​+2. Descrierea situatiei în care poate fi aplicat – este foarte important sa știm care sunt situațiile în care putem aplica un șablon de proiectare. De aceea, este nevoie sa se prezinte o descriere a problemei și a  contextului în care ar putea sa apara. Aceasta descriere poate fi realizata din  perspective diferite:
  
-''​pw.println ( "Stand and unfold yourself"​ );''​+• Ar putea sa fie o descriere axata pe aspecte specifice de proiectare, cum ar fi modul de  reprezentare a diverșilor algoritmi folosind principiile programarii orientate pe obiecte.
  
-''​pw.close( );''​+• Poate fi realizata o descriere care sa conțina o ierarhie de clase sau o structura de obiecte care sunt implicate în implementarea șablonului de proiectare.
  
-La baza avem un flux de iesire care va scrie in fisierul "​file"​ niste octeti.  +• Uneori, ​este important sa specificam ​lista de condiții ​care trebuie ​sa fie îndeplinite pentru a putea aplica șablonul ​de proiectareÎn acest cazdescrierea ​trebuie sa cont,ina aceasta lista de condiții.
-CipherOutputStream ​este o clasa decorator si adauga peste fluxul ​de octeti proprietatea ca acesta este criptat. Deoarece aceasta clasa nu ofera suport de lucru decat pentru octeti avem nevoie de un alt decorator ​care sa ne permita sa adaugam text in fluxul ​de iesireDe aceea folosim clasa PrintWriter.  +
-Observati ca atat PrintWriterOutputStreamWriter cat si CipherOutputStream sunt doar niste decoratoare ele modificand intr-un anumit mod fluxul, totusi acest flux trebuie sa apara de undeva si de accea toata aceasta decorare trebuie sa aiba la baza un flux instantiat (FileOutputStream).+
  
 +3. Descrierea soluției – descrie elementele care alcatuiesc proiectarea,​ relațiile, responsabilitațile și colaborarile acestora. Este indicat ca soluția sa nu conțina doar codul complet, ci și o descriere formala a unei problem și modul în care o interacțiune generala a conceptelor (clase și obiecte) poate rezolva ​ problema.
  
- {{ :​poo:​breviare:​img2.jpg |}}+4. Rezultatele și consecințele utilizarii – reutilizarea codului reprezinta, adesea, un factor esențial în programarea orientata pe obiecte, motiv pentru care pentru un șablon de proiectare trebuie sa fie prezentate consecințele pe care le au folosirea acestuia asupra flexibilităț ii, extensibilitații sau portabilitații soluției software.
  
-Mapand pe diagrama exemplul nostru, FileOutputStream joaca rolul de componenta concretaPrintWriterOutputStreamWriter ​si CipherOutputStream joaca rolul de decoratoare concrete.+==== Builder ==== 
 +  
 +Acest pattern este folosit în restaurantele ​de tip fast food care furnizeaza meniul pentru copii. Un meniu pentru copii consta de obicei într-un fel principalunul secundaro bautura ​si o jucarie. Pot exista variatii în ceea ce privește conținutul mediului, dar procesul ​de creare este acelasi. Fie ca la felul principal se alege un hamburger sau un cheesburger procesul va fi același. Vânzatorul le va indica celor din spate ce sa puna pentru fiecare fel de mâncare, pentru bautura si jucarie. Toate acestea vor fi puse într-o punga si servite clientilor.
  
-<note important>​Atentie:​ Daca in tot lantul de decorari nu exista un decorator care sa aiba la baza o componenta concreta constructia nu va functiona.</​note>​ 
  
-==== Fluxuri====+{{:​poo:​breviare:​img.jpg?​400|}}
  
-Dennis Ritchie implementeaza in 1984 primul sistem I/O pe baza de stream in cadrul sistemului ​de operare UnixAcest concept are la baza crearea unui canal de comunicatie intre doua entitati: sursa si destinatieSursa scrie informatii in canalul ​de comunicatieiar destinatia poate sa citeasca aceste date, canalul permitand trecerea fluxului ​de date intr-o singura directie.+  
 +Acest sablon realizeaza separarea constructiei ​de obiecte complexe ​de reprezentarea lor astfel încât acelasi proces sa poata crea diferite reprezentariBuilder-ul creeaza parti ale obiectului complex ​de fiecare data când este apelat ​si retine toate starile intermediareCând departamentul este terminat, clientul primeste rezultatul ​de la builder. În acest modse obtine un control mai mare asupra procesului ​de constructie de noi obiecte. 
 +Spre deosebire de alte pattern-uri, din categoria creational, care creau produsele într-un singur pas, pattern-ul Builder construieste un produs pas cu pas la comanda coordonatorului. În cadrul acestei aplicatii, pattern-ul este folosit pentru a instantia departamentele. Pentru a întelege cum ar trebui folosit acest pattern, puteti urmari exemplul de mai jos.
  
-Fluxurile pot fi clasificate dupa directia canalului de comunicatie:​ +<code java> 
-  ​* fluxuri de intrare(pentru citirea datelor), +public class User  { 
-  * fluxuri de iesire (pentru scrierea datelor)+    ​private final String firstName// required 
-dupa tipul de date pe care le opereaza: +    ​private final String lastName; // required 
-  * fluxuri de octeti (transfer serial pe 8 biti), +    ​private final int age; // optional 
-  * fluxuri de caractere (transfer serial pe 16 biti);  +    ​private final String phone// optional 
-sau dupa actiunea lor: +    ​private final String address; /optional 
-  * fluxuri primare de citire/scriere a datelor, +    ​private User(UserBuilder builder) { 
-  * fluxuri pentru procesarea datelor. +        this.firstName = builder.firstName; 
- +        this.lastName ​builder.lastName;​ 
-Datorita faptului ca exista doua directii de comunicare, exista doua tipuri mari de stream-uri pentru orice nod de comunicatie:​ input stream si output stream. +        this.age = builder.age
-Tastatura ar fi un exemplu de input stream, iar monitorul un output stream+        this.phone builder.phone
-Sursa si destinatia nu trebuie sa fie neaparat periferice, ele pot fi si module soft. +        this.address ​builder.address;
- +
-Figure 1: +
-input stream +
- +
-Figure 2: +
-output stream +
- +
-=== Fluxuri de octeti ==+
- +
-Programele folosesc fluxuri de octeti pentru a citi sau scrie date pe 8 biti (un octet)Pentru o mai buna intelegere a acestor clase, se va propune spre analiza implementarea clasei Copy care contine metode care asigura copierea unui fisier text in alt fisier text. +
- +
-public class Copy { +
-    private String input , output ​; +
-    public Copy( String input , String output ) { +
-        this.input input +
-        this.output ​output ​;+
     }     }
-    public ​void copyFile ​() { +    public ​String getFirstName() { 
-        ​InputStream in =null +        ​return firstName;
-        OutputStream out =null; +
-        try { +
-            in =newFileInputStream ( input ) ; +
-            out =newFileOutputStream ( output ) ; +
-            while( in .available() > 0) +
-                out.write(in.read ()) ; +
-        } +
-        catch( FileNotFoundException e ) { +
-            e . printStackTrace () ;} +
-        catch( IOException e ) { +
-            e . printStackTrace () ;} +
-        finally { +
-            try{ +
-                if( out !=null) out.close();​ +
-                if( in !=null) ​ in.close() ; +
-            } +
-            catch( IOException e ) { +
-                e . printStackTrace () ;} +
-        }+
     }     }
-+    ​public String ​getLastName() { 
- +        ​return lastName;
-Fluxurile la nivel de octet utilizeaza doua ierarhii avand drept clase radacina: InputStream si OutputStream. Exista mai multe clase pentru manipularea fluxurilor de octeti, folosite in aceeasi maniera, avand moduri diferite de contructie. Cele mai utilizate clase sunt FileInputStream si FileOutputStream. +
- +
-<note warning> IMPORTANT! Fisierele text trebuie sa se afle in folderul radacina al proiectului care contine clasele care prelucreaza informatia din aceste fisiere. +
-</​note>​ +
- +
-== Fluxurile de caractere == +
- +
-Limbajul Java stocheaza valorile de tip caracter folosind conventii Unicode. +
-Fluxurile de caractere I/O isi translateaza automat formatul intern de la setul de caractere locale. Toate clasele de fluxuri de caractere mostenesc clasele Reader si Writer. Ca si in cazul fluxurilor de octeti, exista clase de fluxuri de caractere specializate pentru operatiile I/O cu fisiere: FileReader si FileWriter.  +
-Se va oferi un exemplu elocvent pentru a intelege mai bine uzitarea acestor clase. +
- +
-public ​class Read { +
-    private ​String ​input; +
-    public ReadString input ) { +
-        ​this.input = input ;+
     }     }
-    public ​void read () { +    public ​int getAge() { 
-        ​FileReader stream = null;  +        ​return age
-        ​BufferedReader br = null; +    } 
-        ​try{ +    ​public ​String ​getPhone() { 
-            stream = new FileReader ( input ) ; +        ​return phone;
-            br = new BufferedReader ( stream ) ; +
-            ​String ​line = br.readLine ​() ; +
-            while (line != null) { +
-                System .out .println (line) ; +
-                line= br.readLine () ; +
-            } +
-        ​+
-        catch(FileNotFoundException e ) { +
-            e . printStackTrace () ;+
-        catch ( IOException e ) {  +
-            e . printStackTrace () ;} +
-        finally { +
-            try {  +
-                if( stream !=null) { +
-                    stream.close() ;} +
-                if( br !=null) { +
-                    br.close() ;} +
-            }    +
-            catch( IOException e ) { +
-                e . printStackTrace () ;} +
-        }+
     }     }
-    public ​static void main String args [ ] ) { +    public ​String getAddress() { 
-        ​Read r = new Read("​fisier1.in"​) ; +        ​return address;
-        r.read () ;+
     }     }
-+    public String toString() { 
- +        ​return "​User:"​+this.firstName+"​ "+this.lastName+"​ "+this.age+" "+this.phone+"​ " + this.address
-<note warning>​Observatie:​ Obiectul BufferedReader creaza un flux de intrare a caracterelor cu stocare temporara ​(si posibilitate de citire a caracterelor sub forma de liniidin fluxul de intrare a caracterelor primit ca parametru (stream), utilizand dimensiunea implicita a tabloului intern. +    ​} 
-</​note>​ +    public ​static class UserBuilder ​
- +        ​private final String firstName
-== Fluxuri cu zone tampon == +        ​private final String lastName
- +        ​private int age
-Pentru un flux I/O fara zone tampon fiecare cerere de citire sau scriere este administrata direct de  sistemui de operareAceasta face ca programul sa fie mai putin eficient, deoarece fiecare cerere declanseaza accesul la disc, activitate in retea sau alte operatii care consuma timp. +        ​private String phone
-Pentru a reduce timpul de procesare a fluxurilor, platforma Java implementeaza fluxuri I/O cu zone tamponFuxurile de intrare cu zone tampon citesc datele dintr-o zona de memorie cunoscuta ca tampon (buffer); API –ul de intrare este apelat numai cand tamponul este golSimilar, fluxurile de iesire scriu datele in +        ​private ​String ​address
-zona de tampon si API-ul de iesire este apelat atunci cand tamponul este plin. +        ​public UserBuilder(String firstName, String lastName{ 
-Un program poate converti un flux fara zona tampon intr-un flux cu zona tampon astfel: un obiect de tip flux fara zona tampon este trecut ca argument unui contructor pentru o clasa de tip flux cu zona tampon. +            ​this.firstName ​firstName
- +            ​this.lastName ​lastName;
-== Fluxuri standard == +
- +
-Limbajul Java pune la dispozitia utilizatorului trei fluxuri standard pentru comunicare cu consola: +
-  - fluxul standard de intrare (Standard Input) - folosit pentru citirea datelor; +
-  - fluxul standard de iesire (Standard Output) - folosit pentru afisarea datelor; +
-  - fluxul standard de eroare (Standard Error ) - folosit pentru afisarea erorilor. +
-In consecinta, clasa System din pachetul java.lang contine trei referinte statice de urmatoarele tipuri: +
-  - InputStream in; +
-  - PrintWriter out; +
-  - PrintWriter err. +
- +
-Astfel, pentru Standard Input exista fluxul System.in, pentru Standard Output se uziteaza System.out, iar pentru Standard Error este System.err. +
- +
-<note warning>​Observatie:​ Nu este necesara instantierea acestor trei stream-uri, deoarece ele se deschid automat inaintea executiei aplicatiei. Celelalte stream-uri se deschid in momentul crearii lor, prin apelul constructorului clasei ​ corespunzatoare. +
-De asemenea, acestea nici nu inchid prin apelul metodei close().</​note>​ +
- +
-Pentru inceput, se va prezenta un exemplu in care se uziteaza obiecte de tip InputStreamReader,​ BufferedReader si o instanta statica din clasaSystem. +
-Clasa Suma contine o metoda care citeste de la tastatura doua numere intregi, iar, pentru simplitate, acestea sunt citite ca obiecte de tip String, urmand a fi convertite. +
- +
-public class Suma { +
-    ​int a, b ; +
-    public ​void read () +
-        ​InputStreamReader stream= null;  +
-        ​BufferedReader br= null+
-        ​try{ +
-            stream = new InputStreamReader ( System.in ) +
-            br = new BufferedReader ( stream ) +
-            String ​line = br.readLine () +
-            a = Integer.parseInt ​line ; +
-            ​line br.readLine () +
-            ​Integer.parseInt ( line ) ;+
         }         }
-        ​catchFileNotFoundException e ) { +        ​public UserBuilder age(int age) { 
-            ​e.printStackTrace () ;} +            ​this.age = age; 
-        ​catch IOException e ) { +            return this; 
-            ​printStackTrace () ;} +        ​
-        ​finally{ +        ​public UserBuilder phone(String phone) { 
-            ​try{ +            ​this.phone = phone; 
-                ifstream !=null+            return this; 
-                    ​stream.close() ​+        ​
-                if ( br != null) +         
-                    br.close() ​+        ​public UserBuilder address(String address{ 
-            +            this.address = address
-            ​catch ​IOException e ) { +            ​return this
-                e . printStackTrace ​() ;}+        
 +        ​public User build() { 
 +            ​return new User(this);
         }         }
     }     }
 +    ​
 +  public static void main(String[] args) {
 +        User user1 = new User.UserBuilder("​Lokesh",​ "​Gupta"​)
 +                             ​.age(30)
 +                             ​.phone("​1234567"​)
 +                             ​.address("​Fake address 1234")
 +                             ​.build();​
 +        User user2 = new User.UserBuilder("​Jack",​ "​Reacher"​)
 +                             ​.age(40)
 +                             ​.phone("​5655"​)
 +                             //no address
 +                             ​.build();​
 +   }
 } }
- +</​code>​
-In al doilea exemplu, se va prezenta citirea de la tastatura a doua numere intregi,​utilizand un obiect de tip +
-Scanner. Aceasta clasa pune la dispozitie o serie de metode pentru citirea celor mai importante tipuri predefinite de date din limbajul Java. +
- +
-public class Test { +
-    public static void main( String args[ ]) throws Exception { +
-        Scanner in = new Scanner ( System . in ) ; +
-        int a, b ; +
-        a = in . nextInt () ; +
-        b = in . nextInt () ; +
-        int result; +
-        result = a + b ; +
-        System.out.println ( a + " + " + b + " = " + result) ; +
-        in.close() ; +
-    } +
-}+
poo/breviare/breviar-13.1546867620.txt.gz · Last modified: 2019/01/07 15:27 by carmen.odubasteanu
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