Dekorater (projektni uzorak)

S Vikipedije, slobodne enciklopedije

Dekorater je objektno-orijentisani projektni uzorak. Svrha dekoratera je dinamičko dodavanje odgovornosti(funkcionalnosti) nekom objektu. Proširivanje odgovornosti(funkcionalnosti) nasleđivanjem je nepraktično zbog eksponencijalnog porasta broja klasa u hijerarhiji, pa se uzorak dekorater nameće kao rešenje takvog problema.[1]

Učesnici[uredi | uredi izvor]

Komponenta[uredi | uredi izvor]

Predstavlja interfejs za objekte koji se dekorišu(dopunjuju).

Subjekat[uredi | uredi izvor]

Klasa objekata koji se dekorišu(dopunjuju).

Dekorater[uredi | uredi izvor]

Sadrži referencu na klasu Komponenta i nasleđuje interfejs klase Komponenta.

Konkretni dekorater[uredi | uredi izvor]

Implementira metode iz interfejsa tako što ih dekoriše(dopunjuje).[2]


Primeri[uredi | uredi izvor]

C++[uredi | uredi izvor]

#include <iostream>

class Komponenta{
public:
    virtual void operacija() = 0;
};

class Subjekat : public Komponenta{
public:
    void operacija() {
        std::cout << "Prikaz obicnog subjekta." << std::endl;
    }
};

class Dopuna : public Komponenta{
public:
    Dopuna(Komponenta *komp) : komponenta(komp) {}
    virtual void operacija() = 0;
protected:
    Komponenta *komponenta;
};

class KonkretnaDopuna : public Dopuna{
public:
    KonkretnaDopuna(Komponenta *komponenta) : Dopuna(komponenta) {}
    void operacija() {
        std::cout << "Dodatak za obican subjekat. ";
        komponenta->operacija();
    }
};

int main() {
    Komponenta *k1 = new Subjekat();
    Komponenta *k2 = new Subjekat();

    std::cout << "<----- stanje pre dopune ----->" << std::endl;
    k1->operacija();
    k2->operacija();

    Dopuna *d1 = new KonkretnaDopuna(k1);

    std::cout << "\n<----- stanje nakon dopune ----->" << std::endl;
    d1->operacija();
    k2->operacija();

return 0;
}

Reference[uredi | uredi izvor]

  1. ^ ETF Dekorater„Arhivirana kopija” (PDF). str. 2,3,4,5 i 6. Arhivirano iz originala (PDF) 22. 04. 2017. g. Pristupljeno 21. april 2017. 
  2. ^ Dekorater-učesnici„Arhivirana kopija” (PDF). str. 7. Arhivirano iz originala (PDF) 22. 04. 2017. g. Pristupljeno 21. april 2017.