Documente Academic
Documente Profesional
Documente Cultură
Examen IP 2011
Examen IP 2011
întoarce una din mai multe subclase posibile ale unei clase, în
funcţie de datele pe care le primeşte.
Scop
• Defineşte o interfaţă pentru crearea unui obiect, dar lasă
subclasele să decidă ce clasă să instanţieze.
• Metoda Factory permite unei clase să defere instanţierea
subclaselor. Mai este cunoscut şi ca Constructor Virtual
• Aplicabilitate
• O clasă nu poate anticipa clasa obiectelor pe care trebuie
să le creeze
• O clasă doreşte ca subclasele sale să specifice obiectele
pe care le creează
• Clasele delegă responsibilitatea uneia sau mai multor
subclase ajutătoare
1 edited by gl 53 ban
Structura
Consecinte
• Elimină legarea între clasele specifice aplicaţiei din cod
• codul de creare foloseşte doar interfaţa clasei Product
• Facilitează derivarea
• subclasele pot astfel modifica produsul creat
• Poate conecta ierarhii paralele de clase
• lasă clienţii să apeleze FM
Sablonul Abstract Factory: o interfaţă pentru crearea şi
returnarea uneia dintre mai multe familii de obiecte relaţionate
Scop
• Oferă o interfaţă pentru crearea de familii de obiecte
familii de obiecte înrudite sau dependente fără
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
2 edited by gl 53 ban
• Trebuie forţat 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
• uşor de modificat
Promovează consistenţa între produse
toate produsele unei familii se modifică împreună, în
acelaşi timp
• Este dificilă susţinerea de tipuri noi de produse
necesită o modificare în interfaţa AbstractFactory
3 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() }
}
4 edited by gl 53 ban
Consecinte
• Adăugarea şi ştergerea produselor la execuţie
• Mai puţină derivare
evită ierarhia paralelă pentru creatori
• Specificarea de obiecte noi prin varierea valorilor
prototipurilor
clientul se comportă diferit prin delegarea către
prototip
• Specificarea de obiecte noi prin varierea structurii
prototipurilor
produse compuse
• Fiecare subclasă a Prototype trebuie să implementeze
clone
dificil când clasele există deja sau
obiectele interne nu permit copierea sau au referinţe
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 }
5 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 clienţi dintr-un singur punct
• dorim ca instanţa să fie extensibilă
poate permite deasemenea şi un set numărabil de instanţe
• optimizare faţă de vizibilitatea globală
• mai bine decât o clasă statică:
• nu se poate răzgândi
• metode niciodată virtuale
Structura
6 edited by gl 53 ban
Consecinte
• Acces controlat la instanţa unică
• Permite rafinarea operaţiilor şi reprezentării
• Permite un număr variabil (dar precis) de instanţe
• Reducerea vizibilităţii globale
Sablonul Command
Scop
Încapsulează cereri ca obiecte, şi permite:
• parametrizarea clienţilor cu diferite cereri
• înlănţuirea sau log-area cererilor
• suport pentru operaţii anulabile (UNDO)
Aplicabilitate
Parametrizarea obiectelor
Specificarea, înlănţuirea, şi executarea cererilor la diferite
momente
Suport undo
Modelarea tranzacţiilor
• structurarea sistemelor construite pe operaţii
primitive, în jurul operaţiilor de nivel înalt
interfaţa comună invocarea identică a tuturor tranzacţiilor
Sablonul
public interface Command {
public void Execute();
}
• Scop- reducerea actionPerformed la:
public void actionPerformed(ActionEvent e) {
Command cmd = (Command)e.getSource();
cmd.Execute();
}
7 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();
}
}
8 edited by gl 53 ban
Sablonul Composite
Scop
Tratează obiectele individuale şi compunerile acestor
obiecte uniform
Compune obiectele în structuri arborescente pentru a
reprezenta agregări recursive
Aplicabilitate
reprezentarea ierarhiilor de obiecte de tip parte-întreg
abilitatea de a ignora diferenţa dintre compuneri de
obiecte şi obiecte individuale
Consecinte
• Defineşte ierarhii uniforme de clase
compunere recursivă de obiecte
• Face clienţii simpli
nu trebuie să ştie dacă este o frunză sau un compus
simplifică codul deoarece evită tratarea diferită a fiecărei
clase
Mai uşor de extins
uşor de adăugat noi clase Composite sau Leave
aplicaţie fericită a Principiului Deschis-Închis
• Design prea general
sunt necesare verificări de tip pentru a restricţiona tipurile
admise într-o anumită structură compusă
9 edited by gl 53 ban
Exemplu
class Window {
GUIWidgets[] myWidgets;
WidgetContainer[] myContainers;
Sablonul Strategy
Scop
Defineşte o familie de algoritmi, încapsulează fiecare
algoritm, îi face interschimbabili
Permite algoritmului să varieze independent de clienţii
ce îl folosesc
Aplicabilitate
Sunt necesare variante diferite ale unui algoritm
Un algoritm foloseşte date despre care clienţii nu
trebuie să ştie
evită expunerea structurilor de date complexe,
specifice algoritmului
Multe clase relaţionate diferă doar prin comportament
configurează o clasă cu un comportament
particular
10 edited by gl 53 ban
Structura
Participanti
Strategy
declară o interfaţă comună tuturor algoritmilor.
Context foloseşte această interfaţă pentru a apela
algoritmul definit de o clasă ConcreteStrategy
ConcreteStrategy
implementează algoritmul folosind interfaţa 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
când i se modifică starea internă
obiectul va părea că îşi schimbă clasa
Aplicabilitate
comportamentul obiectului depinde de starea sa
11 edited by gl 53 ban
trebuie să îşi modifice comportamentul la execuţie în
funcţie de stare
operaţii cu instrucţiuni condiţionale multiple, depinzând
de starea obiectului
- starea reprezentată de una sau mai multe constante enumerate
- mai multe operaţii cu aceeaşi structură condiţională
Structura
Decorator
• Modificarea comportamentului obiectelor individuale fără să
creeze o clasă derivată nouă
• Acesta este un alt caz în care este favorizată relaţia de
conţinere asupra moştenirii
• Decoratorul este un obiect grafic, dar conţine obiectul pe
care îl decorează
– Poate apela metode grafice, poate executa calcule
adiţionale, şi le poate trimite către obiectul conţinut şi
decorat
public Decorator(JComponent c) {
setLayout(new BorderLayout());
//adaugă componenta la container
add("Center", c);}
}
12 edited by gl 53 ban
Principiul deschis-închis (PDI)
“Entităţile software trebuie să fie deschise la extinderi, dar
închise la modificări”, citat de R.Martin
- Deschidere la extinderi
Comportamentul modulului poate fi extins
- Închidere la modificări
Codul sursă al modulului nu trebuie modificat
- Modulele trebuie scrise astfel încât să poată să fie extinse fără
să fie modificate
“Nici un program semnificativ nu poate fi 100% închis. R.
Martin, “Principiul Deschis- Inchis”, 1996
- Închidere strategică, nu completă
- Închiderea se obţine prin utilizarea abstractizării
- Construiţi metode ce pot fi invocate dinamic
• Pentru a determina deciziile strategiei generale
• Ex. Desenare de pătrate înainte de cercuri
- Utilizaţi o abordare “condusă de date” pentru a obţine închiderea
- Plasaţi deciziile strategiei particulare într-o locaţie separată
• Ex. Fişier sau obiect separat
- Minimizează localizările schimbărilor viitoare
Euristici PDI
• Modificările datelor publice aduc un risc de “deschidere” a
modulului
– Pot provoca un efect de modificări în cascadă, în mai
multe locaţii neaşteptate;
– Erorile pot fi dificil de corectat/ de găsit în totalitate
• Corecturile pot introduce erori în alte părţi
• Membrii non-privaţi sunt modificabili
– Pot schimba starea clasei
13 edited by gl 53 ban
Principiul Substituţiei (Liskov)- PSL
Prin moştenire, orice proprietate adevărată despre obiectele
supertipului trebuie să rămână adevărată despre obiectele
subtipului. B.Liskov, 1987
Funcţiile ce folosesc pointeri/ referinţe la clasele de bază
trebuie să poată folosi obiecte ale claselor derivate fără 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
• Soluţia 1: relaţie de derivare inversă
– Dacă în clasa de bază iniţială există doar
comportament adiţional
• Ex. Căţel- căţel_care_nu_se_mişcă
• Soluţia 2: extragerea unei clase de bază comune
– Dacă atât clasa iniţială cât şi clasele derivate au
comportamente diferite
– Pentru Pinguini: Păsări, PăsăriZburătoare, Pinguini
• Clase cu o stare defectă:
– Ex. Căţei stupizi sau paralizaţi
14 edited by gl 53 ban
III. O clasă de bază într-o ierarhie nu trebuie să îşi ştie
subclasele
IV. Modulele cu implementări detaliate depind de abstracţiuni,
şi nimic nu depinde de ele
V. PDI= Scopul, PID= mecanismul
VI. PSL= asigurarea pentru PID
Euristici PID
Proiectaţi centrat pe interfeţe,nu pe implementare
Utilizaţi moştenirea pentru a evita legarea directă de clase:
Principii fundamentale
• Cele trei principii sunt strâns relaţionate
• Încălcarea PSL sau PID duce inevitabil la încălcarea PDI
• Principiile sunt esenţiale pentru a profita de avantajele
dezvoltării OO
15 edited by gl 53 ban
Sablonul Factory…………………………………….….1
Sablonul Abstract Factory…………………………….2
Sablonul Prototype……………………………………..4
Sablonul Singleton……………………………………..6
Sablonul Command……………………………………..7
Sablonul Composite………………………….…………9
Sablonul Strategy………………………………………..10
Sablonul State..............................................................11
Decorator……………………………………………………..12
Principiul deschis-închis (PDI)…………………………13
Principiul Inversării Dependenţelor (PID)…………….14
16 edited by gl 53 ban