You are on page 1of 2

Decorator Tip i scop: ablon structural; ata eaz , n mod dinamic, responsabilit i suplimentare unui obiect, independent de alte

instan e ale aceleia i clase, ca alternativ la mo tenire (caracter static, se aplic ntregii clase); Solu ie: func ionalitatea original a unei clase Core este rafinat ntr-o interfa LCD (Lowest Common Denominator), din care se deriveaz att clasa Core, ct i clasa Wrapper; un Wrapper ncapsuleaz o referin c tre un obiect LCD, c ruia i deleag atribu iile;

Participan i: Interface: declararea interfe ei care descrie func ionalitatea Core; CoreFunc ionality: implementarea conceptului Core; OptionalWrapper : descrierea conceptului de decorator OptinalOne, OptionalTwo, OptionalThree: diverse tipuri de decorator; Exemplu:
#include <vector> #include <algorithm> #include <string> #include <iostream> using namespace std; // interface LCD class IPizzaNapoletana { public: virtual void printIngredients() = 0;

virtual ~IPizzaNapoletana(){} }; // class Margueritta (Core) is a IPizzaNapoletana (LCD) class Margueritta : public IPizzaNapoletana { public: Margueritta() { ingredients.push_back("mozzarella"); ingredients.push_back("tomatoes"); ingredients.push_back("basil"); ingredients.push_back("olive oil"); } void printIngredients() { cout << "Margueritta ingredients: "; for_each( ingredients.begin(), ingredients.end(), printString); cout << endl; } protected: vector<string> ingredients; private: static void printString(string s) { cout << s << " "; } }; // class Decorator (is a IPizzaNapoletana ) class Decorator: public IPizzaNapoletana { IPizzaNapoletana* pInnerObject; public: Decorator(IPizzaNapoletana* p) : pInnerObject(p){} // delegate to base class /*virtual*/ void printIngredients() { pInnerObject->printIngredients(); } }; class KetchupDecorator : public Decorator { public: KetchupDecorator(IPizzaNapoletana* p): Decorator(p){} /*virtual*/ void printIngredients() { // delegate to base class and add extra stuff Decorator::printIngredients(); cout << "Ketchup" << endl; } }; class PepperDecorator : public Decorator { public: PepperDecorator(IPizzaNapoletana* p): Decorator(p){} /*virtual*/ void printIngredients() { // delegate to base class and add extra stuff Decorator::printIngredients(); cout << "Pepper" << endl; } }; int main() { // client has the responsibility to compose desired configurations IPizzaNapoletana* pPizza = new PepperDecorator( new KetchupDecorator( new Margueritta ) ); pPizza->printIngredients(); return 0; }

You might also like