Design Patterns/Behavioral Patterns

Template Method Pattern (C++)

개발새발 2019. 8. 4. 12:20
반응형

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

반응형