본문 바로가기
  • soobinhand의 기술 블로그
Computer Science/디자인 패턴

[디자인 패턴] Strategy Pattern

by soobinhand 2021. 10. 29.
728x90

목적

  • 같은 종류의 작업을 하는 알고리즘을 정의합니다.
  • 각 알고리즘을 캡슐화하고 알고리즘들을 서로 바꿔 사용할 수 있도록합니다.
  • 해당 패턴은 알고리즘을 사용하는 클라이언트로부터 독립적으로 알고리즘을 바꿔서 적용시킬 수 있도록합니다.

패턴이 필요한 경우

  • 경우에 따라 서로 다른 여러 알고리즘이 존재할 때.
  • 알고리즘이 실행 시점에 결정되어져서 조건문(if, switch...) 등을 이용해서 다른 알고리즘을 선택해야 하는 경우.

문제

  • 알고리즘의 다른 버전이 존재해서, 중복으로 존재하거나 if문을 이용해서 선택해야하는 경우.
  • OCP 를 위반하게 됩니다.
  • 결국 변경되는 부분과 변경되지 않는 부분을 분리하여 설계하자는 것이 이 패턴의 목적입니다.

해결방안

  • 중복을 공통화시킵니다.
  • 실행 시점에 맞는 알고리즘을 호출하도록 합니다.
  • 상속 또는 인터페이스를 활용합니다.
  • 그 결과 수정해야할 경우 strategy를 추가하고, 나머지는 변경하지 않아도 됩니다.

  • 오리가 있다고 생각해봅시다.
  • 장난감 오리와 진짜 오리가 있습니다.
  • 장난감 오리는 날 수 없지만 진짜 오리는 날 수 있습니다.
  • 그럴 때 flyable이라는 인터페이스를 만들어 진짜 오리에만 구현하게끔 합니다.
  • 그렇게하면 바뀌는 부분과 그렇지 않은 부분이 분리됩니다.

결론

  • 변화하는 부분과 그대로 있는 부분을 분리하려면 여러개의 클래스 집합을 만들어야함.
  • 그럴 때, 인터페이스나 추상 클래스를 사용하여 캡슐화를 함.
  • 실제 구현은 하위 strategy 클래스에 위임함.
728x90

댓글