Dekorater (projektni uzorak)
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]
- ^ ETF Dekorater„Arhivirana kopija” (PDF). str. 2,3,4,5 i 6. Arhivirano iz originala (PDF) 22. 04. 2017. g. Pristupljeno 21. april 2017.
- ^ Dekorater-učesnici„Arhivirana kopija” (PDF). str. 7. Arhivirano iz originala (PDF) 22. 04. 2017. g. Pristupljeno 21. april 2017.