전반적인 처리 과정이 동일하고, 세부적인 구현만 다소 다른 경우 서로 독립된 클래스 형태로 프로그램을 구현하게 되면 똑같은 프로그램을 반복해서 구현해야 하는 문제가 발생한다. 이렇게 구현된 프로그램은 유지, 보수 시에도 동일한 수정 사항을 반복 적용해야 되는 문제가 있다.

해결 : 동일한 처리 과정에 해당하는 모듈은 하나로 합쳐서 작성, 관리하고 서로 다른 부분은 각자의 자식 클래스에서 구현하게 함으로써 구현에 따른 부담도 줄이고, 동일한 모듈을 반복해서 수정해야 하는 문제도 없앨 수 있다(클래스 상속 관계를 이용).

클래스에 상관없이 동일한 처리 과정을 수행하는 맴버 함수는 상위 클래스에만 정의한다. 이는 클래스 상속 관계의 특성 상 상위 클래스에 정의된 맴버 함수는 하위 클래스에서도 사용할 수 있기 때문이다. 클래스 마다 구현 내용이 달라져야 하는 모듈의 경우에는 클래스 상속 관계에서 Overriding을 활용해서 상위 클래스에서 정의한 모듈을 하위 클래스에서 재정의 한다. 이 경우 하위 클래스 객체에 대해 해당 모듈이 호출되면 다형성 규칙에 의해 상위 클래스에서 정의한 모듈이 아닌 하위 클래스에서 정의한 모듈이 불려지게 된다.

이처럼 클래스 상속 관계를 이용하면 구체적인 구현은 다르나 큰 틀에서 알고리즘의 기본 골격이 동일한 경우, 동일한 기본 골격을 상위 클래스에서 하나의 모듈로 작성, 관리할 수 있게 되는데 이를 Template Method라고 한다. Template Method를 포함하는 클래스 구조를 Template Method 패턴이라고 한다.

사용 예제
요구사항 : 오피스 프로그램을 제작하는데 한글 문서(hwp), MSWORD 문서(doc)를 저장하는 기능을 구현해야 한다. 추후에 저장을 할 수 있는 문서 포맷이 늘어 날 수 있다.

문서를 저장하는 순서
step1. 문서를 연다.
step2. 문서를 저장한다.
step3. 문서를 닫는다.

소스 코드

using System;
using System.Collections.Generic;
using System.Text;
namespace TemplateMethodPattern
{
    class Document
    {
        // template method
        // 문서 파일 저장
        public bool DocSave()
        {
            // step1. 문서를 연다.
            if (!DocFileOpen()) return false;
            // step2. 문서를 저장한다.
            if (!DocFileSave()) return false;
            // step3. 문서를 닫는다.
            if (!DocFileClose()) return false;
            // 저장 성공
            return true;
        }
        protected virtual bool DocFileOpen() { return true; }
        protected virtual bool DocFileSave() { return true; }
        protected virtual bool DocFileClose() { return true; }
    }
    class HWPDocument : Document
    {
        protected override bool DocFileOpen()
        {
            // todo : HWP 문서 열기 처리 로직
            Console.WriteLine("한글 문서 열기.");
            return true;
        }
        protected override bool DocFileSave()
        {
            // todo : HWP 문서 저장 처리 로직
            Console.WriteLine("한글 문서 저장.");
            return true;
        }
        protected override bool DocFileClose()
        {
            // todo : HWP 문서 닫기 처리 로직
            Console.WriteLine("한글 문서 닫기.");
            return true;
        }
    }
    class MSWORDDocument : Document
    {
        protected override bool DocFileOpen()
        {
            // todo : MS Word 문서 열기 처리 로직
            Console.WriteLine("MS word 문서 열기.");
            return true;
        }
        protected override bool DocFileSave()
        {
            // todo : MS Word 문서 저장 처리 로직
            Console.WriteLine("MS word 문서 저장.");
            return true;
        }
        protected override bool DocFileClose()
        {
            // todo : MS Word 문서 닫기 처리 로직
            Console.WriteLine("MS word 문서 닫기.");
            return true;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // MS Word 문서 저장
            MSWORDDocument msword = new MSWORDDocument();
            msword.DocSave();
            // HWP 문서 저장
            HWPDocument hwp = new HWPDocument();
            hwp.DocSave();
        }
    }
}

'디자인 패턴' 카테고리의 다른 글

Abstract Factory Pattern  (0) 2009.06.09
객체지향 설계에서 클래스 상속의 두가지 목적  (0) 2009.06.08

+ Recent posts