-----------------------------------------------------------------------------
[Decorator]
의도:
객체에 동적으로 새로운 서비스를 추가할 수 있게 한다. Decorator패턴은 기능의 추가를
위해서 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공한다.
다른 이름:
Wrapper
-----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//
// A Structural part of GoF's Design Patterns
//
// - Decorator
//
/////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <tchar.h>
#include <iostream>
#include <memory>
/////////////////////////////////////////////////////////////////////////////
//
// Decorator
//
//
/////////////////////////////////////////////////////////////////////////////
class Component
{
public:
virtual ~Component() {}
public:
virtual void Operation (void) = 0;
};
class ConcreteComponent : public Component
{
public:
virtual void Operation (void)
{
std::cout << "ConcreteComponent::Operation()" << std::endl;
}
};
class Decorator : public Component
{
public:
explicit Decorator (Component* p) :
Component_(p)
{
}
public:
virtual void Operation (void)
{
if (Component_.get())
Component_->Operation ();
}
private:
std::auto_ptr<Component> Component_;
};
class ConcreteDecoratorA : public Decorator
{
public:
explicit ConcreteDecoratorA (Component* p) :
Decorator(p)
{
}
public:
virtual void Operation (void)
{
Decorator::Operation();
std::cout << "ConcreteDecoratorA::Operation()" << std::endl;
}
};
class ConcreteDecoratorB : public Decorator
{
public:
explicit ConcreteDecoratorB (Component* p) :
Decorator(p)
{
}
public:
virtual void Operation (void)
{
Decorator::Operation();
std::cout << "ConcreteDecoratorB::Operation()" << std::endl;
}
};
/////////////////////////////////////////////////////////////////////////////
//
// Startup
//
//
/////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
std::auto_ptr<Component> p;
p.reset( new ConcreteDecoratorB (
new ConcreteDecoratorA (
new ConcreteComponent())) );
p->Operation ();
return 0;
}
-----------------------------------------------------------------------------
ConcreteComponent::Operation()
ConcreteDecoratorA::Operation()
ConcreteDecoratorB::Operation()