-----------------------------------------------------------------------------
[Template Method]
의도:
오퍼레이션에 알고리즘의 기본 골격 구조를 정의하고 구체적인 단계는 서브클래스에 정의한다.
Template Method 클래스의 서브클래스는 알고리즘의 구조를 변경하지 않고 알고리즘 처리
단계들을 재정의 할 수 있다.
-----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//
// A Behavioral part of GoF's Design Patterns
//
// - Template Method
//
/////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <tchar.h>
#include <iostream>
#include <memory>
/////////////////////////////////////////////////////////////////////////////
//
// Template Method
//
/////////////////////////////////////////////////////////////////////////////
class AbstractClass
{
public:
virtual ~AbstractClass()
{
}
public:
void TemplateMethod (void)
{
std::cout << "AbstractClass::TemplateMethod()" << std::endl;
std::cout << "\t";
PrimitiveOperation1();
std::cout << "\t";
PrimitiveOperation2();
std::cout << std::endl;
}
virtual void PrimitiveOperation1 (void)
{
}
virtual void PrimitiveOperation2 (void)
{
}
};
class ConcreteClassA : public AbstractClass
{
public:
virtual void PrimitiveOperation1 (void)
{
std::cout << "ConcreteClassA::PrimitiveOperation1()" << std::endl;
}
virtual void PrimitiveOperation2 (void)
{
std::cout << "ConcreteClassA::PrimitiveOperation2()" << std::endl;
}
};
class ConcreteClassB : public AbstractClass
{
public:
virtual void PrimitiveOperation1 (void)
{
std::cout << "ConcreteClassB::PrimitiveOperation1()" << std::endl;
}
virtual void PrimitiveOperation2 (void)
{
std::cout << "ConcreteClassB::PrimitiveOperation2()" << std::endl;
}
};
/////////////////////////////////////////////////////////////////////////////
//
// Startup
//
//
/////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
std::auto_ptr<AbstractClass> a;
a.reset ( new ConcreteClassA() );
a->TemplateMethod ();
a.reset ( new ConcreteClassB() );
a->TemplateMethod ();
return 0;
}
-----------------------------------------------------------------------------AbstractClass::TemplateMethod()
ConcreteClassA::PrimitiveOperation1()
ConcreteClassA::PrimitiveOperation2()
AbstractClass::TemplateMethod()
ConcreteClassB::PrimitiveOperation1()
ConcreteClassB::PrimitiveOperation2()