템플릿 메서드 패턴
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 주석을 따르세요.
직접 해보기
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.