Referenced: https://www.youtube.com/watch?v=Wao5HiXM_Cg&list=PLe6NQuuFBu7FhPfxkjDd2cWnTy2y_w_jZ&index=4
영상에서는 Java를 이용해 패턴을 적용했지만 python으로 새롭게 구현해보자는 취지에서 작성했다. python에서는 인터페이스를 생성할 수 없어서 따로 만들지 않았고 생성을 강제할 필요가 있는 SumStrategy의 get() 메서드만 추상 클래스속 추상 메서드로 정의했다.
이렇게 되면 필수 동작에 대해 여러 가지 수행 방법을 정의할 수 있고 방법이 달라질 때마다 SumPrinter에서 코드 수정이 필요하지 않다.
from abc import *
class SumPrinter:
def print(self, sumStrategy, N):
print("The Sum of 1 -", N, ": ", end="")
print(sumStrategy.get(N))
class SumStrategy(metaclass = ABCMeta):
@abstractmethod
def get(N):
pass
class SimpleSumStrategy(SumStrategy):
def get(N):
sum = N
for i in range(N):
sum += i
return sum
class GaussSumStrategy(SumStrategy):
def get(N):
return int(N*(N+1)/2)
if __name__ == "__main__":
sum_printer = SumPrinter()
sum_printer.print(SimpleSumStrategy, 100)
sum_printer.print(GaussSumStrategy, 100)