전략 패턴(strategy pattern)은 정책 패턴(policy pattern)이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 '직접' 수정하지 않고 전략이라고 부르는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다.
class Animal:
def speak(self):
pass
class Cat(Animal):
def speak(self):
print("meow")
class Lion(Animal):
def speak(self):
print("roar")
def makeSpeak(animal:Animal):
animal.speak()
def createAnimal(input_str:str):
if input_str == "cat":
return Cat()
elif input_str == "lion":
return Lion()
input_str = input("choose animal(cat or lion): ")
animal = createAnimal(input_str)
makeSpeak(animal)
위의 코드를 보자. makeSpeak()
함수 안에서는 특별한 if문이 없지만, 특별한 코드 수정 없이 cat
과 lion
이 상호 교체가 가능한 전략 패턴이다.
다른 예로, Node.js에서 사용하는 미들웨어 라이브러리인 passport에서는, 여러 가지 '전략'을 기반으로 인증할 수 있게 한다. 서비스 내의 회원가입된 아이디와 비밀번호를 기반으로 인증하는 LocalStrategy 전략과 페이스북, 네이버 등 다른 서비스를 기반으로 인증하는 OAuth 전략 등을 지원한다. 로그인 방식의 '전략'만 바꿔서 두 가지 방식으로 로그인하는 것을 구현한 것이다.
장점
코드 변경 없이 새로운 전략을 추가 할 수 있다.
확장에 유리한 코드를 작성할 수 있다.
런타임에 전략을 변경시킬 수 있다.
단점
어플리케이션에 들어가는 모든 전략을 알고 있어야 한다.
전략을 추상화한 인터페이스가 효율적이지 못할 수 있다.