반응형
Template Method Pattern (C++)
목적
객체의 연산에는 알고리즘 뼈대만(템플릿) 정의하고 각 단계에서 수행하는 구체적인 처리들은 서브클레스에게 위임한다.
코드의 공통적인부분과 아닌 부분을 구별하여 코드 중복을 제거하고 hook연산을 추가하여 확장성을 높인다.
사용 시나리오
- 파일 뷰어를 만든다고 가정한다. 파일뷰어는 doc,txt등 여러 확장자의 파일들을 보여줄 수 있다.
- 파일을 보여줄 때 내부적으로 항상 open -> view -> save log과정을 거친다.
[AbstractClass]
class FileViewer {
public:
void viewFile() { //템플릿 메소드 역할을 하는 함수
open();
view();
saveLog();
hookFunc();
}
protected:
virtual void open() = 0;
virtual void view() = 0;
virtual void saveLog() = 0;
virtual void hookFunc() {} //hook 함수는 구현하지 않고 빈상태로 둔다.
};
[ConcreteClass]
class DocFileViewer : public FileViewer {
protected:
virtual void open() {
cout<<"open Doc File"<<endl;
}
virtual void view() {
cout<<"View Doc File"<<endl;
}
virtual void saveLog() {
cout<<"Save Doc File view log"<<endl;
}
virtual void hookFunc() {
cout<<"Doc hookFunc"<<endl;
}
};
class TextFileViewer : public FileViewer {
protected:
virtual void open() {
cout<<"open Text File"<<endl;
}
virtual void view() {
cout<<"View Text File"<<endl;
}
virtual void saveLog() {
cout<<"Save Text File view log"<<endl;
}
};
[사용 예]
int main(int argc, const char * argv[]) {
FileViewer* fileViewer = new DocFileViewer();
fileViewer->viewFile();
delete fileViewer;
cout<<""<<endl;
fileViewer = new TextFileViewer();
fileViewer->viewFile();
return 0;
}
실행 결과
open Doc File
View Doc File
Save Doc File view log
Doc hookFunc
open Text File
View Text File
Save Text File view log
Program ended with exit code: 0
반응형
'Design Patterns > Behavioral Patterns' 카테고리의 다른 글
Command Pattern (C++) (0) | 2019.12.22 |
---|---|
Chain of Responsibility Pattern (C++) (0) | 2019.12.15 |
Behavior Pattern (행동 패턴) (0) | 2019.12.15 |
Strategy Pattern (C++) (0) | 2019.07.07 |
Observer Pattern (C++) (0) | 2019.03.24 |