템플릿 메서드 패턴
Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 52번째.
템플릿 메서드 패턴은 알고리즘의 구조를 변경하지 않고 하위 클래스가 특정 단계를 재정의할 수 있도록, 알고리즘의 골격을 기본 클래스에서 정의합니다.
템플릿 메서드가 포함된 기본 클래스입니다:
class DataProcessor:
def process(self):
"""알고리즘 구조를 정의하는 템플릿 메서드"""
self.read_data()
self.process_data()
self.save_data()
def read_data(self):
print("Reading data...")
def process_data(self):
raise NotImplementedError("Subclasses must implement this")
def save_data(self):
print("Saving data...")템플릿 메서드 process()는 알고리즘 단계를 정의하며, process_data()는 서브클래스에서 구현하도록 남겨둡니다.
추상 메서드를 구현하는 구체 클래스를 생성합니다:
class CSVProcessor(DataProcessor):
def process_data(self):
print("Processing CSV data")
class JSONProcessor(DataProcessor):
def process_data(self):
print("Processing JSON data")각 구체 클래스는 필수 단계에 대해 자체적인 구현을 제공합니다.
템플릿 메서드를 사용하세요:
csv_processor = CSVProcessor()
csv_processor.process()
print() # 빈 줄
json_processor = JSONProcessor()
json_processor.process()게임 템플릿을 사용한 또 다른 예제를 만들어 보겠습니다:
class Game:
def play(self):
"""Template method for playing a game"""
self.start_game()
self.play_game()
self.end_game()
def start_game(self):
print("Game started!")
def play_game(self):
raise NotImplementedError("Define the game rules")
def end_game(self):
print("Game ended!")
class Chess(Game):
def play_game(self):
print("Playing chess - thinking strategically...")
class Soccer(Game):
def play_game(self):
print("Playing soccer - running and kicking...")
chess = Chess()
chess.play()출력:
Reading data...
Processing CSV data
Saving data...
Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!핵심 포인트: 템플릿 메서드 패턴은 부모 클래스에서 공통 알고리즘 구조를 정의하면서 서브클래스가 특정 단계를 커스터마이징할 수 있도록 합니다. 부모 클래스는 전체적인 흐름을 제어하지만, 서브클래스는 구체적인 구현을 제공합니다. 이를 통해 개별 단계에서의 유연성을 허용하면서도 일관된 구조를 유지할 수 있습니다.
챌린지
중급적절한 캡슐화와 메서드를 사용하여 template.py와 driver.py를 구현하세요. 단계별 안내를 위해 TODO 주석을 따르세요.
치트 시트
템플릿 메서드 패턴(Template Method Pattern)은 알고리즘의 골격을 기본 클래스에서 정의하고, 하위 클래스에서 알고리즘의 구조를 변경하지 않고도 특정 단계를 재정의할 수 있도록 합니다.
템플릿 메서드를 가진 기본 클래스를 생성합니다:
class DataProcessor:
def process(self):
"""알고리즘 구조를 정의하는 템플릿 메서드"""
self.read_data()
self.process_data()
self.save_data()
def read_data(self):
print("Reading data...")
def process_data(self):
raise NotImplementedError("Subclasses must implement this")
def save_data(self):
print("Saving data...")추상 메서드를 구현하는 구체 클래스들을 생성합니다:
class CSVProcessor(DataProcessor):
def process_data(self):
print("Processing CSV data")
class JSONProcessor(DataProcessor):
def process_data(self):
print("Processing JSON data")템플릿 메서드를 사용합니다:
csv_processor = CSVProcessor()
csv_processor.process()
json_processor = JSONProcessor()
json_processor.process()템플릿 메서드 패턴은 부모 클래스에서 공통적인 알고리즘 구조를 정의하면서 하위 클래스가 특정 단계를 커스터마이징할 수 있게 해줍니다. 부모 클래스가 전체적인 흐름을 제어하고, 하위 클래스는 구체적인 구현을 제공합니다.
직접 해보기
from template import Template
# 테스트 케이스 처리기
test_case = input()
if test_case == "basic_test":
# TODO: 이름이 "Test Name"인 Template 객체 생성
# TODO: 객체의 display_info() 메서드 호출
pass
elif test_case == "validation_test":
# TODO: 이름이 "Validation Test"인 Template 객체 생성
# TODO: name 속성을 사용하여 "Name: {obj.name}" 형식으로 이름 출력
pass이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.