프로그래밍 기술/Escort GoF의 디자인 패턴 C#

[C#] 템플릿 메서드 패턴(Template Method Pattern) - 구현

언제나 휴일 언제나휴일 2016. 4. 29. 12:44
반응형

24. 템플릿 메서드 패턴(Template Method Pattern)


템플릿 메서드 패턴(Template Method Pattern) 클래스 다이어그램

[그림] 템플릿 메서드 패턴(Template Method Pattern) 클래스 다이어그램

TemplateMethod.zip


24.4 구현

 

 템플릿 메서드 패턴에 대한 예제 프로그램을 구현하는 순서는 EHApp, MyApp 순으로 하겠습니다.

 

24.4.1 EHApp

 

 EHApp 클래스에서 사용자에 노출할 메서드는 Do 메서드 하나입니다. 그리고, Do 메서드에서 수행할 작업 절차는 초기화, 사용자와 상호 작용, 해제화를 하는 것으로 정하였습니다.

 

public void Do()

{

    InitInstance();

    Run();

    ExitInstance();

}

 

 그리고, 초기화와 해제화의 경우는 실제 작성할 응용의 목적에 따라 재 정의를 할 수 있어야 겠지요.

 

protected virtual void InitInstance(){    }

protected virtual void ExitInstance(){    }

 

 사용자와 상호 작용을 하는 부분도 선택한 메뉴가 종료 키가 아니라면 선택한 키에 따라 동작하는 것을 반복하기로 하였습니다. 대신 선택한 키가 1일 경우에는 제품 정보를 보여주기로 하였죠.

 

protected void Run()

{

    ConsoleKey key = ConsoleKey.Escape;

    while((key = SelectMenu())!=ConsoleKey.Escape)

    {

        switch(key)

        {

            case ConsoleKey.F1: About(); break;

            default: KeyProc(key); break;

        }

        Console.WriteLine("아무키나 누르세요");

        Console.ReadKey();

    }

}

 

 

 물론, 선택한 키에 따라 어떠한 동작을 할 것인지에 대한 구체적인 구현도 각 응용마다 다를 것입니다. 제품에 대한 정보도 다를 수 있겠죠. EHApp에서는 파생 클래스에서 재 정의할 수 있게 해야 할 것입니다.

 

protected virtual void About()

{

    Console.WriteLine("EH Camera");

}

protected virtual void KeyProc(ConsoleKey key)

{

    Console.WriteLine("잘못된 메뉴를 선택하였습니다.");

}

 

EHApp.cs

using System;

namespace TemplateMethod

{

    class EHApp

    {

        public void Do()

        {

            InitInstance();

            Run();

            ExitInstance();

        }

        protected void Run()

        {

            ConsoleKey key = ConsoleKey.Escape;

            while((key = SelectMenu())!=ConsoleKey.Escape)

            {

                switch(key)

                {

                    case ConsoleKey.F1: About(); break;

                    default: KeyProc(key); break;

                }

                Console.WriteLine("아무키나 누르세요");

                Console.ReadKey();

            }

        }

        protected virtual void InitInstance(){    }

        protected virtual void ExitInstance(){    }

        protected virtual void About()

        {

            Console.WriteLine("EH Camera");

        }

        protected virtual void ViewMenu()

        {

            Console.WriteLine("ESC:프로그램 종료 F1:제품 정보");

        }

        protected virtual void KeyProc(ConsoleKey key)

        {

            Console.WriteLine("잘못된 메뉴를 선택하였습니다.");

        }

        private ConsoleKey SelectMenu()

        {           

            ViewMenu();

            Console.WriteLine("메뉴를 선택하세요.");

            return Console.ReadKey().Key;

        }

    }

}

 

  

24.4.2 MyApp

 

 MyApp 클래스에서는 목적에 맞게 초기화 부분과 해제화 부분에 대한 재 정의를 하는 것을 보여줄 것입니다. 그리고, 선택한 키에 따라 수행하는 메서드와 제품 정보를 보여주는 부분도 재 정의를 해야겠지요. 물론, 부분적으로 기반 클래스에 정의한 것을 사용을 하는 경우도 있을 것입니다.

 

MyApp.cs

using System;

namespace TemplateMethod

{

    class MyApp:EHApp

    {

        protected override void InitInstance()

        {

            Console.WriteLine("사진 관리자 프로그램 V0.1");

            Console.WriteLine("아무키나 누르세요.");

        }

        protected override void ExitInstance()

        {

            Console.WriteLine("사진 관리자 프로그램을 종료합니다.");

        }

        protected override void About()

        {

            base.About();

            Console.WriteLine("응용 개발팀 2012. 5. 30");

        }

        protected override void ViewMenu()

        {

            base.ViewMenu();

            Console.WriteLine("F2: 사진 추가 F3: 사진 검색");

        }

 

        protected override void KeyProc(ConsoleKey key)

        {

            switch(key)

            {

                case ConsoleKey.F2: AddPicture(); return;

                case ConsoleKey.F3: SearchPicture(); return;                      

            }                    

            base.KeyProc(key);

        }

        void AddPicture()

        {

            Console.WriteLine("사진 추가 기능을 선택하였습니다.");

        }

        void SearchPicture()

        {

            Console.WriteLine("사진 검색 기능을 선택하였습니다.");

        }

    }

}

 

  

 이를 사용하는 부분은 개체 생성과 Do 메서드 호출 및 개체 소멸을 하는 것 밖에 없겠죠.

 

Program.cs

namespace TemplateMethod

{

    class Program

    {

        static void Main(string[] args)

        {

            MyApp app = new MyApp();

            app.Do();

        }

    }

}

 

 

다음 그림은 메뉴를 F1, F2, F3, F4, ESC 순으로 선택하였을 때의 실행 화면입니다.


템플릿 메서드 패턴 예제 실행 화면 

[그림] 템플릿 메서드 패턴 예제 실행 화면

 

반응형