curs-07

50
Ingineria Programării Curs 7 Curs 7 Ovidiu Gheorghieş, [email protected] Adriana Gheorghieş, [email protected]  D  e  s  ig  n   P  a  t  t  e  r  n  s ,  I  M od  e  l  e d  e  pro  i  ec  tar  e,  I

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() { }

    }