전략 패턴(strategy pattern)이란 정책패턴(policy pattern)이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 '직접'수정하지않고 전략이라고 부루는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴입니다.
전략 패턴의 구조
전략(strategy) : 구체화된 여러 알고리즘들의 추상화로써, 변하는 부분을 담당
전략 콘크리트(concrete strategy) : 여러 알고리즘의 실제 구현
전략 사용자(context) : 전략을 사용하는 프로그램의 흐름으로, 변하지 않는 것
전략 제공자(client) : 전략 사용자에게 실제 전략으로 사용할 전략 콘크리트 클래스를 주입하는 역할
보다시피 상황에 따라 다양한 알고리즘을 필요로 하는 경우 전략 패턴을 사용할 수 있어요.
그러면 이런 발상을 코드로 옮기기 위해서는 어떻게 전략과 전략 콘크리트를 작성하는 게 좋을까요?
바로 인터페이스와 해당 인터페이스를 구현한 클래스를 사용하는 것이에요!
인터페이스를 통해 전략을 추상화 시켜놓은 후, 적재 적소에 필요한 전략을 구현한 Class를 삽입하는 것이죠.
(장점)
전략 사용자(context)의 코드 변경 없이 새로운 전략을 추가 할 수 있다.
이를 통해 if - else 분기를 제거할 수 있다.
if - else 분기를 제거하면, 단일 책임 원칙을 준수하기 더 수월해진다.
확장에 유리한 코드를 작성할 수 있다.
새롭게 필요한 전략 콘크리트 클래스를 쉽게 만들 수 있다.
개방 폐쇄 원칙을 준수한 코드 작성이 가능하다.
(단점)
어플리케이션에 들어가는 모든 전략을 알고 있어야 한다.
클래스로 분리한 각 전략들이 어느 상황에 사용되어야 할 지 알고 있어야 한다.
이 같은 특성이 어쩌면 유지보수를 더 힘들게 할 수도 있다.
전략을 추상화한 인터페이스가 효율적이지 못할 수 있다.