curs-07
-
Upload
narcisa-angheloiu -
Category
Documents
-
view
4 -
download
0
Transcript of curs-07
-
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() { }
}