python 전략패턴

Kanto(칸토)·2025년 6월 18일
0

오브젝트

목록 보기
3/4
post-thumbnail

전략패턴의 정의

전략패턴의 정의는 다형성과 관련이 있습니다. 주요 사용법은 런타임 시점에 어떤 클래스 객체가 사용될 것인지를 자유롭게 변경하도록 하는 것입니다. 어떤 객체가 오더라도 동일한 코드에서 사용될 수 있어야 합니다.

전략패턴 예시

먼저 교환이 가능한 클래스를 base 클래스로부터 여러개 만들 수 있습니다.
python에서 base클래스를 만들 때는 abstract class를 사용하는 것이 좋습니다. 이것은 추상클래스이며 동시에 interface의 역할을 하게 됩니다.

만약에 어떤 report를 만들어야 한다고 합니다. 그럼 추상클래스를 다음과 같이 작성합니다. 여기서 중요한 것은 @abstractmethod를 사용하여 인터페이스가 되는 함수 이름을 지정하는 것입니다.

from abc import ABC, abstractmethod

class BaseReport(ABC):
	def __init__(self, **kwargs):
    	self.A = kwargs['A'] 
        self.B = kwargs['B']
        ...
    
    @abstractmethod
    def make_report(self):
        pass

그리고 나서 위 추상클래스를 상속하는 구체 클래스를 두 개 만들어보겠습니다.

첫 번째 클래스는 daily report를 생성하는 메써드가 구현된 클래스 입니다.

from abc import ABC, abstractmethod

class DailyReport(ABC):
	def __init__(self, **kwargs):
    	super().__init__(**kwargs)
        ...
    
    @abstractmethod
    def make_report(self):
       """
       DailyReport를 생성하는 실제 로직
       """
       ...
       return report

두 번째 구체 클래스는 weekly report를 생성하는 메써드가 구현된 클래스이니다.

from abc import ABC, abstractmethod

class WeeklyReport(ABC):
	def __init__(self, **kwargs):
    	super().__init__(**kwargs)
        ...
    
    @abstractmethod
    def make_report(self):
       """
       Weekly Report를 생성하는 실제 로직
       """
       ...
       return report

전략패턴의 적용

실제 전략 패턴을 적용할 때 client의 함수는 아래와 같이 작성될 수 있습니다.

if report_type == 'daily':
	report = DailyReport({'A':'a' , 'B':'b'})
elif report_type = 'weekly':
    reoprt = WeeklyReport({'A':'a' , 'B':'b'})
    
report.make_report()

report라는 객체는 DailyReport 도 될 수 있고 WeeklyReport도 될 수 있으므로 다형성이 적용되었습니다. 그리고 클라이언트에서 report_type을 'daily'로 받았느냐 'weekly'로 받았느냐에 따라서 서로 다른 report 알고리즘을 적용할 수 있습니다.

이것이 파이썬에서 strategy pattern의 활용입니다. 알고리즘의 종류라던지 데이터 처리 방법이 여러개가 존재하는 경우 다형성을 이용하여 메써드를 구현하면 경우에 따라서 코드를 변경하지 않고도 여러 알고리즘을 경우에 따라 처리할 수 있습니다.

profile
ML Product Engineer

0개의 댓글