DECORATOR 장식자 패턴
 -객체에 동적으로 새로운 기능을 추가 한다.
 -다른 객체에 영향을 주지 않고 새로운 기능 추가 가능.



class Component{ public: virtual void operation() = 0; }; class ConcreteComponet : public Component{ public: void operation() { cout << "ConcreteComponet" << endl; } }; class Decorator : public Component{ public: Decorator(Component* a) : _Componet(a) {} ~Decorator() { if(_Componet) delete _Componet; } void operation() { if(_Componet) _Componet->operation(); } private: Component* _Componet; }; class ConcreteDecorator : public Decorator{ public: ConcreteDecorator(Component* b) : Decorator(b) {} void operation() { Decorator::operation(); cout << "ConcreteDecorator" <<endl; } }; int main(){ Component* _Component = new ConcreteDecorator(new ConcreteDecorator(new ConcreteComponet)); _Component ->operation(); delete _Component ; return 0; }

class Component{ public: virtual int Cost() = 0; virtual void Order() = 0; }; class ConcreteComponet : public Component{ public: int Cost() { return 6000; } void Order() { cout << "부대찌개" << endl; } }; class Decorator : public Component{ public: Decorator(Component* a) : _Componet(a) {} ~Decorator() { if(_Componet) delete _Componet; } int Cost() {if(_Componet) return _Componet->Cost(); else 0;} void Order() { if(_Componet) _Componet->Order(); } private: Component* _Componet; }; class ConcreteDecoratorA : public Decorator{ public: ConcreteDecoratorA(Component* b) : Decorator(b) {} int Cost() { return Decorator::Cost() + 1000;} void Order() { Decorator::Order(); cout << "라면사리 추가" <<endl; } }; class ConcreteDecoratorB : public Decorator{ public: ConcreteDecoratorB(Component* b) : Decorator(b) {} int Cost() { return Decorator::Cost() + 2000;} void Order() { Decorator::Order(); cout << "떡사리 추가" <<endl; } }; int main(){ Component* pComponent = new ConcreteDecoratorA(new ConcreteDecoratorB(new ConcreteComponet)); pComponent->Order(); cout<<"비용 : "<<pComponent->Cost()<<endl; delete pComponent; return 0; }




+ Recent posts