Ingineria Programrii
Curs 7Curs 7
Ovidiu Gheorghie, [email protected] Gheorghie, [email protected]
Design Patterns, I
Modele de proiectare, I
IP7
Design Patterns(Modele de proiectare)
design n. 1.a. A drawing or sketch. b. A graphic representation, especially a detailed plan for
construction or manufacture. 2. The purposeful or inventive arrangement of parts or
details. 3. The art or practice of designing or making designs.
pattern n. 1.a. A model or an original used as an archetype. b. A person or thing considered worthy of imitation. 2. A plan, diagram, or model to be followed in making things
IP7 Motivaii
Proiectarea sistemelor (orientate-obiect) este dificil
Proiectarea sistemelor (orientate-obiect) extensibile este foarte dificil
Proiectarea sistemelor (orientate-obiect) refolosibile este i mai dificil
Scopuri n proiectare Rezolvarea problemei concrete Crearea unei structuri flexibile, ce poate evolua Evitarea re-proiectrii
IP7 Proiectare bun
Este greu (pentru nceptori) s creeze un proiect bun de prima dat
Proiectanii experi reuesc repede deoarece: Refolosesc soluii folosite n proiecte anterioare [ Experiena creaz experii ]
Apar modaliti standard de a rezolva probleme concrete. Familiaritatea cu acestea poate duce la crearea unui proiect flexibil, elegant i reutilizabil ntr-un timp scurt.
IP7 Surse de inspiraie
Antropologie culturalantropologie = tiin care se ocup cu studiul originii, evoluiei i variabilitii biologice a omului, n corelaie cu condiiile naturale i socio-culturale. (DEX)
Arhitecturtiina i arta de a proiecta i construi cldiri (DEX)
IP7 Antropologia cultural
Frumuseea st n ochii celui care privete sau oamenii admit (accept) faptul c anumite lucruri sunt frumoase iar altele nu?
ntr-o cultur indivizii cad de acord, n mare parte, asupra a ceea ce este considerat frumos.
Cultura transcende credinele individuale.
IP7 Arhitectur
Cristopher Alexander (arhitect american): Este calitatea obiectiv?
Calitatea unei construcii poate fi msurat n mod obiectiv, ea nu este numai o chestiune de gust.
Pattern = soluie la o problem ntr-un anumit context.
IP7 Design bun, design prost
Cum ne dm seama c un anumit design este bun?
Ce este prezent ntr-un design bun i nu se regsete ntr-un design prost?
Ce este prezent intr-un design prost i nu se regasete ntr-un design bun?
IP7 Exemplu: curtea unei case
Curtea unei case ajut oamenii s triasc n ea. Oamenii doresc s aib un spaiu propriu n aer liber
n care s poat admira cerul i stelele, s se bucure de soare i, poate, s planteze flori.
Dar mai sunt i alte lucruri de luat n considerare. De exemplu, atunci cnd o curte are ziduri care nu permit vederea n exterior oamenii nu se simt bine i tind s stea deoparte... ei au nevoie s vad n exterior, ei au nevoie de spaii largi.
Pe de alt parte oamenii i creeaz obinuine. Dac ei trec zilnic ncoace i ncolo prin curte locul le va deveni familiar i l vor folosi.
nume scop
d
e
s
c
r
i
e
r
e
a
p
r
o
b
l
e
m
e
i
IP7 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 romn: abloane de proiectare. Elemente de software
reutilizabil orientat pe obiectEditura Teora, 2002
IP7
Design patterns capture solutions that have developed and evolved over time
GOF
IP7
Elementele unui model de proiectare
Numele Mod de a referi o problem de proiectare, soluiile ei i
consecinele acestora. mbogete limbajul proiectantului Gsirea numelui: cea mai dificil problem
Problema Descrie problema i contextul n care apare
Soluia Descrie elementele modelului, relaiile, resposabilitile i modul de colaborare.
Nu este o soluie concret, ci una abstract Consecinele
IP7 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, faade, flyweight,
proxy) modele comportamentale: se preocup de algoritmi i de
asignarea responsabilitilor ntre obiecte(chain of responsibility, command, interpreter, iterator,
mediator, memento, observer, state, strategy, template method, visitor)
modele creaionale: abstractizeaz procesul de instaniere(abstract factory, builder, factory method, prototype, singleton)
IP7 n acest curs
Singleton: garanteaz existena unei singure instane a unei clase. Se asigur o modalitate de a accesa instana respectiv.
Factory Method: definete o interfa pentru crearea unui obiect, dar las n sarcina subclaselor alegerea tipului acestuia.
Strategy: definete o familie de algoritmi Decorator: asignare de responsabiliti n mod dinamic Composite: obiecte i grupuri tratate uniform Iterator: ofer o modalitate de a accesa obiecte agregate n
mod secvenial fr a cunoate modul de agregare
Template Method: se definete scheletul unui algoritm ntr-o metod, lsnd implementarea pailor algoritmului n seama subclaselor
IP7 Singleton / Unicat
Scop: Garantarea existenei unei singure instane a unei clase. Se asigur o modalitate de a accesa instana respectiv.
Motivaie Un singur spooler Un singur sistem de fiiere Un singur gestionar de ferestre
Aplicabilitate Instana unic a unei clase trebuie s fie accesibil clienilor ntr-
un punct cunoscut Instana unic trebuie s fie extensibil; clienii nu trebuie s i
modifice codul
IP7 Singleton (2)
Structura
Singleton-static uniqueInstance:
-singletonData+static Instance()
+SingletonOperation()+GetSingletonData()
return uniqueInstance
IP7 Singleton (java)
public class Singleton { private static Singleton instance = null; private Singleton() {}public static Singleton getInstance () {
if( instance == null ) { instance = new Singleton();
} return instance;
} public void operation() { }
}
public class Client { public static void main( String arg[] ) {
try { Singleton instance = Singleton. getInstance (); instance.operation();
} catch( Exception e ) { e.printStackTrace();
} }
}
IP7 Singleton (C++)
class Singleton { private:
static Singleton* singleton;Singleton () {}
public: static Singleton* instance() {
if( singleton == 0 ) { singleton = new Singleton();
} return singleton;
}; void operation() {}
};
Singleton* Singleton::singleton = 0;
int main() { Singleton* singleton = Singleton::instance(); singleton->operation();return 0;
}
IP7 Singleton (C++)
Singleton Pattern: A review and analysis of existing C++ implementations
http://www.codeproject.com/cpp/singleton.asp
IP7 Factory Method / Metod fabric
Scop: Definete o interfa pentru crearea unui obiect, dar las n sarcina subclaselor alegerea tipului acestuia.
Motivaie O bibliotec folosete clase abstracte pentru a defini i
menine relaii ntre obiecte. Un tip de responsabilitate este crearea de astfel de
obiecte. Biblioteca tie cnd trebuie creat un obiect, dar nu i
ce tip de obiect trebuie creat (acesta este specific aplicaiei care folosete biblioteca)
IP7 Factory Method (2)
Motivaie - exemplu
Framework
Application
DocumentApplication
+CreateDocument()+NewDocument()
MyDocumentMyApplication
+CreateDocument()
Document* doc =CreateDocument();
// add doc to container
return newMyDocument()
IP7 Factory Method (3)
Aplicabilitate Cnd o clas nu poate anticipa tipul obiectelor care
trebuie s le creeze Cnd o clas vrea ca subclasele s specifice tipul
obiectelor de creat
StructuraProduct
Creator
+FactoryMethod()+AnOperation()
ConcreteCreator
+FactoryMethod()ConcreteProduct
product =FactoryMethod()
return newConcreteProduct
IP7 Factory Method (java)
public interface Product { }
public abstract class Creator { public void anOperation() {
Product product = factoryMethod(); } protected abstract Product factoryMethod();
}
public class ConcreteProduct implements Product { }
public class ConcreteCreator extends Creator { protected Product factoryMethod() {
return new ConcreteProduct(); }
}public class Client {
public static void main( String arg[] ) { Creator creator = new ConcreteCreator(); creator.anOperation();
}}
IP7 Factory Method (C++)
class Product { };
class Creator { protected:
virtual Product* factoryMethod() = 0; public:
void anOperation() { Product* product = factoryMethod(); /** * Do some things with the Product object. */ delete product;
}; };
class ConcreteProduct: public Product { };
class ConcreteCreator: public Creator { protected:
virtual Product* factoryMethod() { return new ConcreteProduct();
}; };
IP7 Factory Method (C++)
int main() { /** * Instantiate a Creator object. */ Creator* creator = new ConcreteCreator();
/** * Call the operation which uses a factory method. */ creator -> anOperation();
/** * Clean-up. */ delete creator;
};
IP7 Strategy / Strategie
Scop: Se definete o familie de algoritmi; se ncapsuleaz fiecare mebru; algoritmii se facinterschimbabili.
Motivaie
Sorter
+MethodWithSort()
Sort
+Sort()
QuickSort NaiveSortHeapSortsort->Sort()
IP7 Strategy (2)
Aplicabilitate Multe clase nrudite difer doar prin comportament Se folosesc diverse variante ale unui algoritm Algoritmii folosesc date irelevante pentru client O clas definete comportamente multiple, definite de
condiii gard la nceputul metodelor. Structur
Context
+ContextInterface()Strategy
+AlgorithmInterface()
ConcreteStrategyA ConcreteStrategyB
IP7 Strategy (java)
// Abstract Strategy class abstract class Strategy{
public abstract void algorithmInterface(); } // ConcreteStrategyAclass class ConcreteStrategyA extends Strategy{
public void algorithmInterface(){ System.out.println("ConcreteStrategyA algorithm is
used now"); }
} // ConcreteStrategyB classclass ConcreteStrategyB extends Strategy{
public void algorithmInterface(){ System.out.println("ConcreteStrategyB algorithm is
used now"); }
}
IP7 Strategy (java)
class Context{ //Default Algorithm private Strategy strategy = new ConcreteStrategyA(); public void changeStrategy(Strategy newStrategy){
strategy=newStrategy; } public void getResult(){
strategy. algorithmInterface(); }
} //Client class public class Client{
public static void main(String args[]){ Context context=new Context(); context.getResult(); context.changeStrategy(new ConcreteStrategyB()); context.getResult();
} }
IP7 Decorator
Scop Obiectelor li se pot ataa respnsabiliti n mod dinamic. Alternativ flexibil la derivare pentru extinderea funcionalitii
Motivaie
IP7 Decorator (2)
Aplicabilitate Adugarea responsabilitilor n mod dinamic i transparent Retragerea responsabilitilor Atunci cnd derivarea devine nepractic
StructuraComponent
+Operation()
ConcreteComponent Decorator
+Operation()
ConcreteDecoratorA-addedState+Operation()
ConcreteDecoratorB
+Operation()+AddedBehavior()
component->Operation()
Decorator::Operation();AddedBehavior();
IP7 Decorator (java)
//VisualComponentclass class VisualComponent{
public VisualComponent(){}; public void draw(){}; public void resize(){};
} //Decorator abstract class Decorator extends VisualComponent{
private VisualComponent comp; Decorator(){}; Decorator(VisualComponent comp){ this.comp=comp; } public void draw(){
comp.draw(); //Implement your code here
} public void resize(){ //Implement your code here }
}
IP7 Decorator (java)
//BorderDecoratorclass BorderDecorator extends Decorator{
private int width;
BorderDecorator(VisualComponent comp, int borderWidth){ //Implement your code here width=borderWidth;
}
public void draw(){ super.draw(); drawBorder(width);
}
public void drawBorder(int width){ System.out.println("This is an example of Decorator design
pattern"); //Implement code here
} }
IP7 Decorator (java)
public class Client{ public static void main(String args[]){ //Create an instance of VisualComponentVisualComponent comp=new VisualComponent();
//Pass this instance to BorderDecoratorcomp=new BorderDecorator(comp,5); comp.draw(); }
}
Alternativ:VisualComponent comp=
new BorderDecorator(new VisualComponent(),5)
IP7 Composite / Amestec
Scop Se dorete gruparea obiectelor n structuri arborescente
pentru a reprezenta relaii de tip parte-ntreg. Obiectele i grupurile de obiecte sunt tratate uniform.
Motivaie
IP7 Composite (2)
Aplicabilitate Reprezentarea relaiei parte-ntreg Ignorarea diferenei dintre obiecte individuale i grupurile de
obiecte Structura
Client Component
+Operation()+Add(c:Component)
+Remove(c:Component)+GetChild(i:int)
Leaf
+Operation()
Composite
+Operation()
for all c:child c->Operation()
child
IP7 Composite (java)
public interface Component { void operation(); void add( Component component ); boolean remove( Component component ); Component getChild( int index );
}
public class Leaf implements Component { public void operation() { } public void add( Component component ) { } public boolean remove( Component component ) {
return false; } public Component getChild( int index ) {
return null; }
}
IP7 Composite (java)
public class Composite implements Component { private Vector children = new Vector(); public void operation() {
int i; for( i = 0; i < children.size(); ++i ) {
Component component = (Component)children.elementAt(i); component.operation();
} } public void add( Component component ) {
children.addElement( component ); } public boolean remove( Component component ) {
return children.removeElement( component ); } public Component getChild( int index ) {
return (Component) children.elementAt(index); }
}
IP7 Composite (java)
public class Client { public static void main( String arg[] ) {
Component composite = new Composite(); Component leaf1 = new Leaf(); Component leaf2 = new Leaf(); composite.add( leaf1 ); composite.add( leaf2 ); composite.operation();
} }
IP7 Iterator
Scop: Ofer o modalitate de a accesa obiecte agregate n mod secvenial fr a cunoate modul de agregare.
Motivaie
List
ListIterator
+First()+Next()
+IsDone()+CurrentItem()
IP7 Iterator (2)
Motivaie (2)Container
+CreateIterator()+Append(i:Item)
List Vector
Iterator
+First()+Next()
+IsDone()+CurrentItem()
ListIterator
+First()+Next()
+IsDone()+CurrentItem()
VectorIterator
Client
IP7 Iterator (3)
Structura
Aggregate
+CreateIterator()
ConcreteAggregate
+CreateIterator()
return newConcreteIterator(this)
ConcreteIterator
Iterator
+First()+Next()
+IsDone()+CurrentItem()
Client
IP7 Iterator (java)
public interface Iterator { Object first() throws IndexOutOfBoundsException; Object next() throws IndexOutOfBoundsException; boolean isDone(); Object currentItem() throws IndexOutOfBoundsException;
}
public interface Aggregate { Iterator createIterator();
}
public class ConcreteAggregate implements Aggregate { public Vector storage = new Vector(); public Iterator createIterator() {
return new ConcreteIterator( this ); }
}
IP7 Iterator (java)
public class ConcreteIterator implements Iterator { private ConcreteAggregate aggregate; private int index = 0;
public ConcreteIterator( ConcreteAggregate aggregate ) { this.aggregate = aggregate;
}
public Object first() throws IndexOutOfBoundsException { Object object = null; if( !aggregate.storage.isEmpty() ) {
index = 0; object = aggregate.storage.firstElement();
} else { throw new IndexOutOfBoundsException();
} return object;
}
IP7 Iterator (java)
public Object next() throws IndexOutOfBoundsException { Object object = null; if( index + 1 < aggregate.storage.size() ) {
index += 1; object = aggregate.storage.elementAt(index);
} else { throw new IndexOutOfBoundsException();
} return object;
}
IP7 Iterator (java)
public boolean isDone() { boolean result = false; if( aggregate.storage.isEmpty() ||
index == aggregate.storage.size() - 1 ) { result = true;
} return result;
}
public Object currentItem() throws IndexOutOfBoundsException { Object object = null; if( index < aggregate.storage.size() ) {
object = aggregate.storage.elementAt( index ); } else {
throw new IndexOutOfBoundsException(); } return object;
} }//class
IP7 Iterator (java)
public class Client { public static void main( String arg[] ) {
Aggregate aggregate = new ConcreteAggregate(); Iterator iterator = aggregate.createIterator();
for(iterator.first(); !iterator.isDone(); iterator.next()) {
Object currentItem = iterator. currentItem();/** * Process currentItem */
} }
}
IP7 Template Method / Metod ablon
Scop: Se definete scheletul unui algoritm ntr-o metod, lsnd implementarea pailor algoritmului n seama subclaselor.
Motivaie
void Application::OpenDocument(string& name){
if (!CanOpenDocument(name))return;
Document* pDoc = CreateDocument();if (pDoc == 0)
return;m_docs.add(pDoc);InitializeOpenDocument(pDoc);pDoc->Read();
}
Document
+Read()
Application
+CreateDocument()+CanOpenDocument()
+InitializeOpenDocument()+OpenDocument()
MyApplication
+CanOpenDocument()+InitializeOpenDocument()
+CreateDocument()
MyDocument
+Read()
IP7 Template Method (2)
Aplicabilitate Implementarea structurii fixe a unui algoritm, lsnd
clasele derivate s implementeze funcionalitatea care variaz
Cnd funcionalitatea comun a unor clase este relocat ntr-o clas de baz
Structur AbstractClass+TemplateMethod()
+PrimitiveOperation1()+PrimitiveOperation2()
ConcreteClass
+PrimitiveOperation1()+PrimitiveOperation2()
PrimitiveOperation1()...
PrimitiveOperation2()
IP7 Template Method
public abstract class AbstractClass { public void templateMethod() {
primitiveOperation1(); primitiveOperation2();
} protected abstract void primitiveOperation1(); protected abstract void primitiveOperation2();
}
public class ConcreteClass extends AbstractClass { protected void primitiveOperation1() { } protected void primitiveOperation2() { }
}
Top Related