25. 템플릿 메서드 패턴(Template Method Pattern)
25.1 개요
템플릿 메서드 패턴은 특정 연산을 수행하는 단계별로 수행해야 할 행위에 대한 약속을 기반 클래스에서 정의하고 각 단계별로 수행하는 구체적 구현은 파생 클래스에서 재정의하는 형태의 패턴입니다.
비슷한 형태의 프로그램을 작성에 필요한 뼈대를 일반화하여 제공하는 것은 실무에서 자주 사용하는 기법입니다. 일반화 과정을 통해 작성된 뼈대가 마련되어 있다면 실제 프로그래밍할 때에는 이를 기반으로 세부적인 기능만 재정의를 하여 효과적으로 프로그래밍할 수 있습니다. 그리고 설계 단계에서 뼈대에 대한 부분을 고민하지 않아도 되어 비용을 줄일 수 있고 기술 노하우를 축적할 수 있게 해 줍니다.
이를 위해서 템플릿 메서드 패턴에서는 특정 연산을 구성하는 세부 기능의 흐름에 대한 정의를 기반 클래스에 일반화합니다. 그리고 이를 기반으로 파생된 클래스에서는 세부 기능의 구체적인 구현에 대해 재정의하는 과정을 거치게 됩니다. 이처럼 템플릿 메서드 패턴에서는 특정 연산을 수행하는 세부 기능의 흐름에 대한 약속과 세부적인 기능에 대한 구체적 구현을 분리하는 패턴입니다.
25. 2 시나리오
EH Camera 회사의 객원 감수를 맡아 여러 작업에 참여를 하다 보니 개발 팀에 새로운 얼굴로 바뀌는 일도 자주 생기네요. 이렇게 개발 팀의 얼굴이 바뀔 때마다 새로운 개발자는 개발에 필요한 기본 기술에 대한 학습 비용이 만만치 않게 들어가는 것을 보게 됩니다. 그리고 예전에 작성했던 프로그램과 비슷한 형태의 프로그램을 제작할 때도 비용이 크게 줄지 않았습니다. 지난 주에는 이 매핑 씨와 저녁을 먹었는데 경영진에서 개발팀에 대한 처우 개선과 기술 노하우를 축적시키는 방법에 대한 얘기가 나왔다고 하네요.
"우리 회사에서 만드는 프로그램들은 대부분 비슷한 구조를 갖고 비슷한 기술을 사용할 것 같은데 매 번 개발 비용이 줄지 않는 것은 이미 개발 공정과 기술 노하우가 최적화 되어서 그런 걸까요?"
"글쎄, 한 번 검토를 해 봐야 할 것 같은데 당분간 이 문제만 신경써도 될까요?"
예전부터 이에 대해 검토를 해 봐야 겠다고 생각만 하고 있었는데 좋은 계기가 된 것 같아요. 이 매핑 씨와 저녁을 한 다음 날부터 강의가 없는 시간에는 EH Camera 회사에 방문하여 이제까지 작성한 여러 프로그램의 설계 문서들을 살펴보았어요. 그리고 비슷한 여러 프로그램이 동작하는 기본 흐름이 비슷함에도 불구하고 사용되는 이름이나 인자등이 다르다는 것을 알게 되었지요. 저는 프로그램을 종류에 따라 분류하고 비슷한 종류의 프로그램들의 기본적인 흐름들에 대한 공통점들을 간추리는 작업을 시작했어요. 그리고 이를 간단한 형식으로 정의하고 이를 기반으로 데모 응용을 작성하였습니다. 마지막으로 이에 대한 기술 문서를 작성하고 개발 팀장에게 보여주었죠.
몇 일이 지난 뒤에 개발 팀에서는 개발 노하우를 축적할 방안을 경영진에 제시하고 경영진에서는 개발 팀의 처우를 어떻게 개선할 지에 대한 검토가 들어갔다고 하네요.
//common.h
#pragma once
#pragma warning (disable:4996)
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
#include <vector>
using std::vector;
#include <string>
using std::string;
#include <iomanip>
using std::ios;
#include <algorithm>
#pragma warning(disable:4482)
//EHApp.h
#pragma once
#include "common.h"
class EHApp
{
public:
void Do()
{
InitInstance();
Run();
ExitInstance();
}
protected:
void Run()
{
int key = 0;
while((key = SelectMenu())!=0)
{
switch(key)
{
case 1: About(); break;
default: KeyProc(key); break;
}
}
}
virtual void InitInstance(){ }
virtual void ExitInstance() { }
virtual void About()
{
cout<<"EH Camera"<<endl;
}
virtual void ViewMenu()
{
cout<<"0:프로그램 종료 1:제품 정보"<<endl;
}
virtual void KeyProc(int key)
{
cout<<"잘못된 메뉴를 선택하였습니다."<<endl;
}
private:
int SelectMenu()
{
int key=0;
ViewMenu();
cout<<"메뉴를 선택하세요."<<endl;
cin>>key;
return key;
}
};
//MyApp.h
#pragma once
#include "EHApp.h"
class MyApp:
public EHApp
{
protected:
virtual void InitInstance()
{
cout<<"사진 관리자 프로그램 V0.1"<<endl;
cout<<"아무키나 누르세요."<<endl;
}
virtual void ExitInstance()
{
cout<<"사진 관리자 프로그램을 종료합니다."<<endl;
}
virtual void About()
{
EHApp::About();
cout<<"응용 개발 팀 2012. 5. 30"<<endl;
}
virtual void ViewMenu()
{
EHApp::ViewMenu();
cout<<"2: 사진 추가 3: 사진 검색"<<endl;
}
virtual void KeyProc(int key)
{
switch(key)
{
case 2: AddPicture(); return;
case 3: SearchPicture(); return;
}
EHApp::KeyProc(key);
}
private:
void AddPicture()
{
cout<<"사진 추가 기능을 선택하였습니다."<<endl;
}
void SearchPicture()
{
cout<<"사진 검색 기능을 선택하였습니다."<<endl;
}
};
//Demo.cpp
#include "MyApp.h"
int main()
{
MyApp *app = new MyApp();
app->Do();
delete app;
return 0;
}
|
'프로그래밍 기술 > Escort GoF의 디자인 패턴' 카테고리의 다른 글
26. 방문자 패턴(Visitor Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
---|---|
24. 전략 패턴(Strategy Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
23. 상태 패턴(State Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
22. 감시자 패턴(Observer Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
21. 메멘토 패턴(Memento Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
20. 중재자 패턴(Mediator Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
19. 반복자 패턴(Iterator Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
18. 해석자 패턴(Interpreter Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
17. 명령 패턴(Command Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
16. 책임 연쇄 패턴(Chain of Responsibility Pattern)[Escort GoF의 디자인 패턴] (0) | 2016.04.04 |