Sablonul Factory: o clas simpl pentru luarea unei decizii-
ntoarce una din mai multe subclase posibile ale unei clase, n funcie de datele pe care le primete. Scop Definete o interfa pentru crearea unui obiect, dar las subclasele s decid ce clas s instanieze. Metoda Factory permite unei clase s defere instanierea subclaselor. Mai este cunoscut i ca Constructor Virtual
Aplicabilitate O clas nu poate anticipa clasa obiectelor pe care trebuie s le creeze O clas dorete ca subclasele sale s specifice obiectele pe care le creeaz Clasele deleg responsibilitatea uneia sau mai multor subclase ajuttoare
2 edited by gl 53 ban
Structura
Consecinte Elimin legarea ntre clasele specifice aplicaiei din cod codul de creare folosete doar interfaa clasei Product Faciliteaz derivarea subclasele pot astfel modifica produsul creat Poate conecta ierarhii paralele de clase las clienii s apeleze FM Sablonul Abstract Factory: o interfa pentru crearea i returnarea uneia dintre mai multe familii de obiecte relaionate Scop Ofer o interfa pentru crearea de familii de obiecte familii de obiecte nrudite sau dependente fr specificarea claselor lor concrete Aplicabilitate Sistemul trebuie s fie independent de cum sunt create, compuse i reprezentate produsele sale Sistemul trebuie configurat de una din mai multe familii de produse
3 edited by gl 53 ban
Trebuie forat ca o familie de obiecte produs s fie folosite mpreun Structura
Consecinte Izolarea claselor concrete apar n ConcreteFactories nu n codul clientului Faciliteaz schimbul de familii de produse un ConcreteFactory apare ntr-un singur loc uor de modificat Promoveaz consistena ntre produse toate produsele unei familii se modific mpreun, n acelai timp Este dificil susinerea de tipuri noi de produse necesit o modificare n interfaa AbstractFactory
4 edited by gl 53 ban
... i a tuturor subclaselor sale, n consecin Exemplu abstract class WidgetFactory { public Window createWindow(); public Menu createMenu(); public Button createButton(); } class MacWidgetFactory extends WidgetFactory { public Window createWindow() { return new MacWidow() } public Menu createMenu() { return new MacMenu() } public Button createButton() { return new MacButton() } }
Sablonul Prototype: ncepe cu o clas instaniat i alizat i o copiaz/ cloneaz pentru a crea instane noi (n loc s creeze efectiv alte instane) Scop Specificai tipul obiectelor care se creeaz folosind o instan prototipic Creai obiecte noi copiind acest prototip Aplicabilitate cnd un sistem trebuie s fie independent de cum sunt create, compuse i reprezentate produsele sale i cnd clasele de instaniat sunt specificate la execuie evitai construirea unei ierarhii de clase-factory paralel cu ierarhia claselor de produse
5 edited by gl 53 ban
Consecinte Adugarea i tergerea produselor la execuie Mai puin derivare evit ierarhia paralel pentru creatori Specificarea de obiecte noi prin varierea valorilor prototipurilor clientul se comport diferit prin delegarea ctre prototip Specificarea de obiecte noi prin varierea structurii prototipurilor produse compuse Fiecare subclas a Prototype trebuie s implementeze clone dificil cnd clasele exist deja sau obiectele interne nu permit copierea sau au referine circulare Exemplu: class Prototype { public Prototype clone() { // code to make a copy of current Prototype object return clone; } // add what ever else you want the class to do } class ProtoExtension extends Prototype { public Prototype clone() { // code to make a copy of current Protoplasm object return clone; } // add more other stuff }
6 edited by gl 53 ban
ClientCodeMethod( Prototype example ) { Prototype myCopy = example.clone(); // do some work using myCopy } Sablonul Singleton: Este o clas din care nu poate exista mai mult de o instan; furnizeaz un punct de acces global la aceast instan Scop Asigur ca o clas s aib doar o singur instan i furnizeaz un punct de acces global la ea Aplicabilitate dorim exact o instan a unei clase accesibilitate pentru clieni dintr-un singur punct dorim ca instana s fie extensibil poate permite deasemenea i un set numrabil de instane optimizare fa de vizibilitatea global mai bine dect o clas static: nu se poate rzgndi metode niciodat virtuale Structura
7 edited by gl 53 ban
Consecinte Acces controlat la instana unic Permite rafinarea operaiilor i reprezentrii Permite un numr variabil (dar precis) de instane Reducerea vizibilitii globale
Sablonul Command Scop ncapsuleaz cereri ca obiecte, i permite: parametrizarea clienilor cu diferite cereri nlnuirea sau log-area cererilor suport pentru operaii anulabile (UNDO) Aplicabilitate Parametrizarea obiectelor Specificarea, nlnuirea, i executarea cererilor la diferite momente Suport undo Modelarea tranzaciilor structurarea sistemelor construite pe operaii primitive, n jurul operaiilor de nivel nalt interfaa comun invocarea identic a tuturor tranzaciilor Sablonul public interface Command { public void Execute(); } Scop- reducerea actionPerformed la: public void actionPerformed(ActionEvent e) { Command cmd = (Command)e.getSource(); cmd.Execute(); }
8 edited by gl 53 ban
Exwmplu abstract class Command { abstract public void execute(); } class OpenCommand extends Command { private Application opener; public OpenCommand(Application theOpener) { opener = theOpener; } public void execute() { String documentName = AskUserSomeHow(); if(name != null) { Document toOpen = new Document( documentName ); opener.add( toOpen ); opener.open(); } } } class Menu { private Hashtable menuActions = new Hashtable(); public void addMenuItem( String displayString, Command itemAction ) { menuActions.put (displayString, itemAction); } public void handleEvent( String itemSelected ) { Command runMe; runMe = (Command) menuActions.get( itemSelected ); runMe.execute(); } }
9 edited by gl 53 ban
Sablonul Composite Scop Trateaz obiectele individuale i compunerile acestor obiecte uniform Compune obiectele n structuri arborescente pentru a reprezenta agregri recursive
Aplicabilitate reprezentarea ierarhiilor de obiecte de tip parte-ntreg abilitatea de a ignora diferena dintre compuneri de obiecte i obiecte individuale
Consecinte Definete ierarhii uniforme de clase compunere recursiv de obiecte Face clienii simpli nu trebuie s tie dac este o frunz sau un compus simplific codul deoarece evit tratarea diferit a fiecrei clase Mai uor de extins uor de adugat noi clase Composite sau Leave aplicaie fericit a Principiului Deschis-nchis Design prea general sunt necesare verificri de tip pentru a restriciona tipurile admise ntr-o anumit structur compus
10 edited by gl 53 ban
Exemplu class Window { GUIWidgets[] myWidgets; WidgetContainer[] myContainers;
public void update() { if(myWidgets != null) for (int k = 0; k < myWidgets.length(); k++) myWidgets[k].update(); if(myContainers != null) for (int k = 0; k < myContainers.length(); k++) myContainers[k].updateElements(); // .. .. etc. } }
Sablonul Strategy Scop Definete o familie de algoritmi, ncapsuleaz fiecare algoritm, i face interschimbabili Permite algoritmului s varieze independent de clienii ce l folosesc Aplicabilitate Sunt necesare variante diferite ale unui algoritm Un algoritm folosete date despre care clienii nu trebuie s tie evit expunerea structurilor de date complexe, specifice algoritmului Multe clase relaionate difer doar prin comportament configureaz o clas cu un comportament particular
11 edited by gl 53 ban
Structura
Participanti Strategy declar o interfa comun tuturor algoritmilor. Context folosete aceast interfa pentru a apela algoritmul definit de o clas ConcreteStrategy ConcreteStrategy implementeaz algoritmul folosind interfaa Strategy Context configurat cu un obiect ConcreteStrategy poate defini o interfa ce permite obiectelor Strategy s i acceseze datele Sablonul State Scop permite unui obiect s i modifice comportamentul cnd i se modific starea intern obiectul va prea c i schimb clasa Aplicabilitate comportamentul obiectului depinde de starea sa
12 edited by gl 53 ban
trebuie s i modifice comportamentul la execuie n funcie de stare operaii cu instruciuni condiionale multiple, depinznd de starea obiectului - starea reprezentat de una sau mai multe constante enumerate - mai multe operaii cu aceeai structur condiional Structura
Decorator Modificarea comportamentului obiectelor individuale fr s creeze o clas derivat nou Acesta este un alt caz n care este favorizat relaia de coninere asupra motenirii Decoratorul este un obiect grafic, dar conine obiectul pe care l decoreaz Poate apela metode grafice, poate executa calcule adiionale, i le poate trimite ctre obiectul coninut i decorat public Decorator(J Component c) { setLayout(new BorderLayout()); //adaug componenta la container add("Center", c);} }
13 edited by gl 53 ban
Principiul deschis-nchis (PDI) Entitile software trebuie s fie deschise la extinderi, dar nchise la modificri, citat de R.Martin - Deschidere la extinderi Comportamentul modulului poate fi extins - nchidere la modificri Codul surs al modulului nu trebuie modificat - Modulele trebuie scrise astfel nct s poat s fie extinse fr s fie modificate Nici un program semnificativ nu poate fi 100% nchis. R. Martin, Principiul Deschis- Inchis, 1996 - nchidere strategic, nu complet - nchiderea se obine prin utilizarea abstractizrii - Construii metode ce pot fi invocate dinamic Pentru a determina deciziile strategiei generale Ex. Desenare de ptrate nainte de cercuri - Utilizai o abordare condus de date pentru a obine nchiderea - Plasai deciziile strategiei particulare ntr-o locaie separat Ex. Fiier sau obiect separat - Minimizeaz localizrile schimbrilor viitoare
Euristici PDI Modificrile datelor publice aduc un risc de deschidere a modulului Pot provoca un efect de modificri n cascad, n mai multe locaii neateptate; Erorile pot fi dificil de corectat/ de gsit n totalitate Corecturile pot introduce erori n alte pri Membrii non-privai sunt modificabili Pot schimba starea clasei
14 edited by gl 53 ban
Principiul Substituiei (Liskov)- PSL Prin motenire, orice proprietate adevrat despre obiectele supertipului trebuie s rmn adevrat despre obiectele subtipului. B.Liskov, 1987 Funciile ce folosesc pointeri/ referine la clasele de baz trebuie s poat folosi obiecte ale claselor derivate fr s tie aceasta. R.Martin, 1996
PSL- Euristici Este ilegal ca o clas derivat s suprascrie o metod a clasei de baz printr-o metod NOP NOP (no-operation): o metod care nu face nimic Soluia 1: relaie de derivare invers Dac n clasa de baz iniial exist doar comportament adiional Ex. Cel- cel_care_nu_se_mic Soluia 2: extragerea unei clase de baz comune Dac att clasa iniial ct i clasele derivate au comportamente diferite Pentru Pinguini: Psri, PsriZburtoare, Pinguini Clase cu o stare defect: Ex. Cei stupizi sau paralizai
Principiul Inversrii Dependenelor (PID) I. Modulele de nivel-nalt nu trebuie s depind de modulele de nivel sczut. Ambele trebuie s depind de abstraciuni. II. Abstraciunile nu trebuie s depind de detalii. Detaliile trebuie s depind de abstraciuni.
15 edited by gl 53 ban
III. O clas de baz ntr-o ierarhie nu trebuie s i tie subclasele IV. Modulele cu implementri detaliate depind de abstraciuni, i nimic nu depinde de ele V. PDI= Scopul, PID= mecanismul VI. PSL=asigurarea pentru PID
Euristici PID Proiectai centrat pe interfee,nu pe implementare Utilizai motenirea pentru a evita legarea direct de clase:
Principii fundamentale Cele trei principii sunt strns relaionate nclcarea PSL sau PID duce inevitabil la nclcarea PDI Principiile sunt eseniale pentru a profita de avantajele dezvoltrii OO