You are on page 1of 50

Ingineria Programrii

Curs 7
Curs 7
Ovidiu Gheorghie, ogh@infoiasi.ro
Adriana Gheorghie, adrianaa@infoiasi.ro
D
e
s
ig
n
P
a
tte
rn
s
, I
M
o
d
e
le
d
e
p
ro
ie
c
ta
re
, I
IP
7
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
IP
7
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
IP
7
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.
IP
7
Surse de inspiraie
Antropologie cultural
antropologie = tiin care se ocup cu
studiul originii, evoluiei i variabilitii
biologice a omului, n corelaie cu condiiile
naturale i socio-culturale. (DEX)
Arhitectur
tiina i arta de a proiecta i construi cldiri
(DEX)
IP
7
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.
IP
7
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.
IP
7
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?
IP
7
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
IP
7
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 obiect
Editura Teora, 2002
IP
7
Design patterns capture solutions that have
developed and evolved over time
GOF
IP
7
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
IP
7
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)
IP
7
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
IP
7
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
IP
7
Singleton (2)
Structura
Singleton
-static uniqueInstance:
-singletonData
+static Instance()
+SingletonOperation()
+GetSingletonData()
return uniqueInstance
IP
7
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();
}
}
}
IP
7
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;
}
IP
7
Singleton (C++)
Singleton Pattern: A review and analysis of
existing C++ implementations
http://www.codeproject.com/cpp/singleton.asp
IP
7
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)
IP
7
Factory Method (2)
Motivaie - exemplu
Framework
Application
Document
Application
+CreateDocument()
+NewDocument()
MyDocument
MyApplication
+CreateDocument()
Document* doc =
CreateDocument();
// add doc to container
return new
MyDocument()
IP
7
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
Structura
Product
Creator
+FactoryMethod()
+AnOperation()
ConcreteCreator
+FactoryMethod()
ConcreteProduct
product =
FactoryMethod()
return new
ConcreteProduct
IP
7
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();
}
}
IP
7
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();
};
};
IP
7
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;
};
IP
7
Strategy / Strategie
Scop: Se definete o familie de algoritmi; se
ncapsuleaz fiecare mebru; algoritmii se fac
interschimbabili.
Motivaie
Sorter
+MethodWithSort()
Sort
+Sort()
QuickSort NaiveSort HeapSort
sort->Sort()
IP
7
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
IP
7
Strategy (java)
// Abstract Strategy
class abstract class Strategy{
public abstract void algorithmInterface();
}
// ConcreteStrategyA
class class ConcreteStrategyA extends Strategy{
public void algorithmInterface(){
System.out.println("ConcreteStrategyA algorithm is
used now");
}
}
// ConcreteStrategyB class
class ConcreteStrategyB extends Strategy{
public void algorithmInterface(){
System.out.println("ConcreteStrategyB algorithm is
used now");
}
}
IP
7
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();
}
}
IP
7
Decorator
Scop
Obiectelor li se pot ataa respnsabiliti n mod dinamic.
Alternativ flexibil la derivare pentru extinderea funcionalitii
Motivaie
IP
7
Decorator (2)
Aplicabilitate
Adugarea responsabilitilor n mod dinamic i transparent
Retragerea responsabilitilor
Atunci cnd derivarea devine nepractic
Structura
Component
+Operation()
ConcreteComponent
Decorator
+Operation()
ConcreteDecoratorA
-addedState
+Operation()
ConcreteDecoratorB
+Operation()
+AddedBehavior()
component->Operation()
Decorator::Operation();
AddedBehavior();
IP
7
Decorator (java)
//VisualComponent
class 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 }
}
IP
7
Decorator (java)
//BorderDecorator
class 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
}
}
IP
7
Decorator (java)
public class Client{
public static void main(String args[]){
//Create an instance of VisualComponent
VisualComponent comp=new VisualComponent();
//Pass this instance to BorderDecorator
comp=new BorderDecorator(comp,5);
comp.draw();
}
}
Alternativ:
VisualComponent comp=
new BorderDecorator(new VisualComponent(),5)
IP
7
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
IP
7
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
IP
7
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;
}
}
IP
7
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);
}
}
IP
7
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();
}
}
IP
7
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()
IP
7
Iterator (2)
Motivaie (2)
Container
+CreateIterator()
+Append(i:Item)
List Vector
Iterator
+First()
+Next()
+IsDone()
+CurrentItem()
ListIterator
+First()
+Next()
+IsDone()
+CurrentItem()
VectorIterator
Client
IP
7
Iterator (3)
Structura
Aggregate
+CreateIterator()
ConcreteAggregate
+CreateIterator()
return new
ConcreteIterator(this)
ConcreteIterator
Iterator
+First()
+Next()
+IsDone()
+CurrentItem()
Client
IP
7
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 );
}
}
IP
7
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;
}
IP
7
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;
}
IP
7
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
IP
7
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 */
}
}
}
IP
7
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()
IP
7
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()
IP
7
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() { }
}

You might also like