Curs 9 - profs.info.uaic.roogh/files/ip/curs-09.pdf · • Template Method: se define şte...
Transcript of Curs 9 - profs.info.uaic.roogh/files/ip/curs-09.pdf · • Template Method: se define şte...
Ingineria Programării
Curs 9Curs 9
Ovidiu Gheorghieş, [email protected] Gheorghieş, [email protected]
Design Patterns
Modele de proiectare
IP9 Bibliografie
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.Design Patterns. Elements of Reusable Object-Oriented Software.Addison-Wesley, 1995
Pe scurt GOF = Gang of Four
În română:
Şabloane de proiectare. Elemente de software reutilizabil orientat pe obiecte
Editura Teora, 2002
IP9
“Design patterns capture solutions that have developed and evolved over time”
GOF
IP9 Modele de proiectare - clasificare
• modele structurale: se preocupă de modul în care clasele şi obiectele sunt compuse pentru a forma structuri mai mari
(adapter, bridge, composite, decorator, façade, flyweight, proxy)
• modele comportamentale: se preocupă de algoritmi şi de asignarea responsabilităŃilor între obiecte
(chain of responsibility, command, interpreter, iterator, mediator, memento, observer, state, strategy, template method, visitor)
• modele creaŃionale: abstractizează procesul de instanŃiere
(abstract factory, builder, factory method, prototype, singleton)
IP9 În cursul 7
• Singleton: garantează existenŃa unei singure instanŃe a unei clase. Se asigură o modalitate de a accesa instanŃa respectivă.
• Factory Method: defineşte o interfaŃă pentru crearea unui obiect, dar lasă în sarcina subclaselor alegerea tipului acestuia.
• Strategy: defineşte o familie de algoritmi
• Decorator: asignare de responsabilităŃi în mod dinamic
• Composite: obiecte şi grupuri tratate uniform
• Iterator: oferă o modalitate de a accesa obiecte agregate în mod secvenŃial fără a cunoaşte modul de agregare
• Template Method: se defineşte scheletul unui algoritm într-o metodă, lăsând implementarea paşilor algoritmului în seama subclaselor
IP9 În cursul 8
• Abstract Factory: oferă o interfaŃă pentru crearea unei familii de obiecte corelate, fără a specifica explicit clasele acestora.
• Builder: separă construirea unui obiect complex de reprezentarea sa, astfel ca procesul de construire să poată crea diferite reprezentări.
• Proxy: oferă un înlocuitor pentru un obiect, prin care se controlează accesul la acel obiect
• Adapter: converteşte interfaŃa unei clase la interfaŃa pe care clienŃii acesteia o aşteaptă
• Bridge: decuplează o abstracŃiune de implementarea sa astfel încât cele două să poată varia independent
• Mediator: defineşte un obiect care încapsulează modul de interacŃiune al unui set de obiecte; promovează cuplarea slabă
• Observer: defineşte o dependenŃă de tip 1-la-n între obiecte, astfel ca atunci când un obiect se modifică, cele care depind de el sunt notificate şi actualizate automat
• Chain of Responsibility: evită cuplarea emiŃătorului unei cereri de receptorul acesteia dând posibilitatea mai multor obiecte să trateze cererea
IP9 În acest curs
• Memento: captarea şi externalizarea stării interne a unui obiect fără a viola încapsularea datelor
• Command: încapsulează o cerere sub forma unui obiect
• Prototype: specifică ce obiecte trebuie create folosind o instanŃă pe post de prototip
• State: permite unui obiect să îşi schimbe comportamentul atunci când starea sa se modifică
• Visitor: reprezintă o operaŃie ce se efectuează asupra structurii obiectului
• Flyweight: folosirea partajării pentru gestionarea unui număr mare de obiecte
• Façade: oferă o interfaŃă unificată pentru un set de interfeŃe dintr-un sistem
IP9 Memento
• Scop: Fără violarea încapsulării, captarea şi externalizarea stării interne a unui obiect astfel ca obiectul să îşi poată reface starea mai târziu.
• MotivaŃie: refacere• Aplicabilitate
– Un instantaneu al unei (sub)stări ale unui obiect trebuie luat pentru a fi restaurat şi
– O interfaŃă directă pentru obŃinerea stării ar expune detalii de implementare şi ar compromite încapsularea
IP9 Memento (2)
Structura
IP9 Memento (3)
IP9 Memento (java)
//This class state will be stored.public class Originator {
private int number; private File file = null;
public Originator(){ } // create a Memento
public Memento getMemento(){ return new Memento(this);
} // restore the state of the originator
public void setMemento(Memento m){number = m.number; file = m.file;
}
IP9 Memento (java)
//state that can be used for read/write from/to disk
private class Memento implements java.io.Serializable {
private int number;
private File file = null;
// private constructor - only the originator can create a Memento
private Memento( Originator o){
number = o.number;
file = o.file;
}
}
}//Originator
IP9 Memento
• ConsecinŃe– Păstrează graniŃele încapsulării– Simplifică obiectul Originator– Folosirea memento-urilor poate fi costisitoare şi
poate induce costuri ascunse
IP9 Command / Comandă
• Scop:
– încapsulează o cerere sub forma unui obiect;– permite parametrizarea clienŃilor cu cereri diferite;– permite memorarea cererilor într-o coadă; – suportă operaŃii reversibile (undoable operations)
IP9 Command (2)
• MotivaŃie: asignarea de funcŃionalităŃi opŃiunilor dintr-un meniuApplication
+add(d:Document)
Menu
+add(mi:MenuItem)
Document
+open()+close()
+cut()+copy()
MenuItem
+onClick()
Command
+execute()
command
onClick(){ command->execute(); }
PasteCommand
+execute()
OpenCommand
+execute()
document
execute(){ document->paste();}
execute(){ name = askUser(); doc = new Document(name); appliation->add(doc); doc->open();}
IP9 Command (3)
• MotivaŃie: definirea macrourilor = secvenŃă de comenzi
Command
+execute()
MacroCommand
+execute()
commands
execute(){
for all c in commandsc->execute();
}
IP9 Command (4)
• StructuraClient Invoker
Receiver
Command
+Execute()
ConcreteCommand
+state
+Execute()
receiver
«instantiates»
Execute () {receiver.Action(); }
IP9 Command (5)
IP9 Command (java)
public interface Command {
public abstract void execute ( );
}
// Receiver class.
class StockTrade {
public void buy() {
System.out.println("You want to buy stocks");
}
public void sell() {
System.out.println("You want to sell stocks ");
}
}
IP9 Command (java)
// Invoker. class Invoker {
private Command buyCommand, sellCommand;
public Invoker( Command bc, Command sc) { buyCommand=bc; sellCommand=sc;
}
void buy( ) { buyCommand. execute( ) ;
}
void sell( ) { sellCommand . execute( );
} }
IP9 Command (java)
//ConcreteCommand Class. class BuyStockCommand implements Command {
private StockTrade stock; public BuyStockCommand ( StockTrade st) {
stock = st; } public void execute( ) {
stock . buy( ); }
}
//ConcreteCommand Class. class SellStockCommand implements Command { private StockTrade stock;
public SellStockCommand ( StockTrade st) { stock = st;
} public void execute( ) {
stock . sell( ); }
}
IP9 Command (java)
// Client public class Client {
public static void main(String[] args) { StockTrade stock=new StockTrade();BuyStockCommand bsc =
new BuyStockCommand(stock);SellStockCommand ssc =
new SellStockCommand(stock);
Invoker testInvoker = new Invoker( bsc,ssc);
testInvoker.buy(); // Buy Shares testInvoker.sell(); // Sell Shares
} }
IP9 Command (5)
• Aplicabilitate– Parametrizarea obiectelor în funcŃie de acŃiunea
care trebuie să o facă;– Specificarea, adăugarea într-o coadă şi
executarea cererilor la momente diferite;– Suportă operaraŃii reversibile (metoda Execute
poate memora starea şi permite apoi revenirea la această stare);
– Structurează sistemul în operaŃii de nivel înalt care sunt construite pe baza unor operaŃii primitive (ex. tranzacŃii).
IP9 Prototype / Prototip
• Scop. Specifică ce obiecte trebuie create folosind o instanŃă pe post de prototip. Noile obiecte sunt create prin copierea acestui prototip.
• MotivaŃie: aplicaŃie grafică/drag-n-drop(pe tablă)• Aplicabilitate
– Sistem independent de cum sunt create produsele şi– Una dintre următoarele
• Clasele de instanŃiat sunt specificate în momentul rulării• Se doreşte evitarea creării unei ierarhii de fabrici• Este mai convenabil să copiez o instanŃă existentă decât să
creez una nouă.
IP9 Prototype / Prototip (2)
• Structura
Client
+Operation()
Prototype
+Clone()
ConcretePrototype1
+Clone()
ConcretePrototype2
+Clone()p =prototype->Clone()
IP9 State / Stare
• Scop: Permite unui obiect să îşi schimbe comportamentul atunci când starea sa se modifică.
• MotivaŃie
TCPConnection
+Open()+Close()
+Acknowledge()
TCPState
+Open()+Close()
+Acknowledge()
TCPEstablished TCPListen TCPClosedstate->Open()
IP9 State / Stare (2)
• Aplicabilitate– Comportamentul unui obiect depinde de stare.
Schimbarea comportamentului trebuie să fie făcută în timpul rulării.
– Se doreşte evitarea existenŃei unei structuri decizionale identice în fiecare metodă.
• StructurăContext
+Request()
State
+Handle()
ConcreteStateA ConcreteStateBstate->Handle()
IP9 Visitor / Hoinar
• Scop: Reprezintă o operaŃie ce se efectuează asupra structurii obiectului. Permite definirea de noi operaŃii fără a schimba clasele elementelor asupra cărora se lucrează.
• MotivaŃie
Node
+TypeCheck()+GenerateCode()
+Write()
VariableReferenceNode AssignementNode OperationNode
cod amestecat
IP9 Visitor / Hoinar (2)
• MotivaŃie (2) Visitor
TypeCheckingVisitor
CodeGeneratingVisitor
+VisitAssignmentNode(n:AssignmentNode)+VisitVariableReferenceNode(n:VariableReferenceNode)
+VisitOperationNode(n:OperationNode)
WritingVisitor
ProgramNode
+AcceptVisitor(v:Visitor)
AssignmentNode
+AcceptVisitor(v:Visitor)
VariableReferenceNode
+AcceptVisitor(v:Visitor)
v->VisitAssignementNode(this v->VisirReferenceNode(this)
IP9 Visitor / Hoinar (3)
• StructuraClient
Visitor
+VisitConcreteElementA(c:ConcreteElementA)+VisitConcreteElementB(c:ConcreteElementB)
ConcreteVisitor1 ConcreteVisitor2
ObjectStructureElement
+AcceptVisitor(v:Visitor)
ConcreteElementA
+AcceptVisitor(v::Visitor)
ConcreteElementB
+AcceptVisitor(v:Visitor)
v->VisitConcreteElementA(this) v->VisitConcreteElementB(this)
IP9 Flyweight / Muscă
• Scop– Folosirea partajării pentru gestionarea unui număr mare de
obiecte cu granulaŃie mică.
• MotivaŃie
Stare
StareIntrinseca StareExtrinseca
IP9 Flyweight / Muscă (2)
• Aplicabilitate (îndeplinirea simultană a condiŃiilor)– AplicaŃia foloseşte un număr mare de obiecte.– SpaŃiul necesar stocării este foarte mare din cauza
numărului mare de instanŃe– Cea mai mare parte a stării unui obiect poate fi făcută
extrinsecă– Multe grupe de obiecte pot fi înlocuite cu relativ puŃine
obiecte partajate– AplicaŃia nu depinde de identitatea obiectelor
IP9 Flyweight / Muscă (3)
• Structura
FlyweightFactory
+GetFlyweight(key)
Client
Flyweight
+Operation(es:ExtrinsicState)
ConcreteFlyweight
-is: intrinsicState
ConcreteUnsharedFlyweigt
-as: allState
if (flyweight[key] exists) { return existing flyweight}else { create new fyweight add it to pool return the new flyweight}
IP9 Façade: The loser learns it all…
bookbook
bookbook
bookbook
bookbook
rezumatsimplificare
IP9 Façade / FaŃadă
• Scop: oferă o interfaŃă unificată pentru un set de interfeŃe dintr-un sistem.
• MotivaŃie: – subsisteme = reducerea complexităŃii– Minimizarea comnunicaŃiei dintre subsisteme
IP9 Facade / FaŃadă (2)
• Aplicabilitate– Se doreşte utilizarea unei interfeŃe simplificate la
un sistem complicat– Există multe dependenŃe între clienŃi şi
implemetările concrete ale conceptelor– Se doreşte stratificarea sistemului
IP9
• StructuraFacade
Facade / FaŃadă (3)