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 순으로 선택하였을 때의 실행 결과입니다.
▶ 실행 결과
사진 관리자 프로그램 V0.1 아무키나 누르세요. ESC:프로그램 종료 F1:제품 정보 F2: 사진 추가 F3: 사진 검색 메뉴를 선택하세요. EH Camera 응용 개발됨 2012.5.30 아무키나 누르세요. ESC:프로그램 종료 F1: 제품 정보 F2: 사진 추가 F3: 사진 검색 메뉴를 선택하세요. 사진 검색 기능을 선택하였습니다. 아무키나 누르세요. ESC:프로그램 종료 F1: 제품 정보 F2: 사진 추가 F3: 사진 검색 메뉴를 선택하세요. 잘못된 메뉴를 선택하였습니다. 아무키나 누르세요. ESC:프로그램 종료 F1: 제품 정보 F2: 사진 추가 F3: 사진 검색 메뉴를 선택하세요. 사진 관리자 프로그램을 종료합니다.