[Design] 전략 패턴, Strategy Pattern

개요

Strategy pattern은 일련의 알고리즘을 정의하고 각각을 분리된 객체(class)에 넣어 필요에 따라 알고리즘을 교체할 수 있도록 만든 디자인 패턴이다.

문제 상황 예시

네비게이션 앱을 만든다고 생각해보자. 주어진 지도 위에 최단 거리를 구하기 위한 알고리즘을 구현해야 한다. 이러한 알고리즘은 자차, 도보, 대중교통을 이용할 때 각각 구현되어야 하며 필요에 따라서 하나를 선택하여 사용해야 한다. 또한 각각은 효율적으로 개발 배포될 수 있도록 구현되어야 하며 각 알고리즘의 영향을 최소한으로 해야한다.

설계 방안

classDiagram Context o-- Strategy Strategy <|.. Strategy_A : Realization Strategy <|.. Strategy_B : Realization Strategy <|.. Strategy_C : Realization Context <-- Client Strategy_A <.. Client : Generate Strategy_B <.. Client : Generate Strategy_C <.. Client : Generate class Context { -strategy +doSomething() +setStrategy() } class Strategy{ +execute() } Strategy_A: +execute() Strategy_B: +execute() Strategy_C: +execute()

Strategy pattern을 사용해서 필요한 알고리즘을 각각의 클래스로 구현한다. 이렇게 별도로 구현된 클래스를 strategies 라고 한다. 모든 strategies는 하나의 interface로 부터 파생되고, 알고리즘 수행에 필요한 하나의 메소드를 노출시켜야 한다.

strategies를 사용하는 클래스를 context라고 하는데, 이것은 하나의 strategies를 담을 수 있는 field 값을 가지고 있어야 한다.

context는 어떠한 strategies를 사용할 것인지 직접 결정하지 않는다. 대신에 client에서 context에게 적절한 strategies를 전달해준다. 그래서 사실 context는 어떠한 strategies를 사용하는지 잘 모른다.

이러한 방식으로 context는 알고리즘에 독립적으로 strategies를 사용할 수 있고, context의 변경 없이 새로운 strategies를 추가 함으로써 알고리즘을 추가하거나 수정하는데 용이하다.

출처 : https://refactoring.guru/design-patterns/strategy