본문 바로가기
Design Pattern

[Design Pattern] 전략 패턴(Strategy Pattern)에 대해 알아보자

by 개발자J의일상 2022. 6. 20.
반응형

Definition

전략 패턴은 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해 준다. 전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다.

 

Situation

- 관련되있는 많은 클래스들 사이에 다른 점은 오직 behavior 뿐일 때

- 알고리즘의 여러 버전 또는 변형이 필요할 때

- 알고리즘은 호출 코드가 노출되어서는 안 되는 데이터에 액세스 하거나 데이터를 활용할 때 

- 클래스의 동작은 런타임에 정의되어야 함

- 클래스에 동일한 알고리즘의 다른 변형 간에 전환하는 대규모 조건문이 있는 경우

 

Structure

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

 

Pros

- 요구사항이 변경되었을 때 조건문을 추가하는 등 기존의 코드를 변경하지 않고 새로운 전략에 대해 새로운 클래스로 관리하기 때문에 OCP의 원칙을 준수할 수 있음

- 알고리즘을 런타임에 교체할 수 있음

- 알고리즘을 사용하는 코드에서 알고리즘의 구현 세부 정보를 분리할 수 있음\

- 상속을 컴포지션으로 교체할 수 있음

- 컨텍스트를 변경하지 않고도 새로운 전략을 도입할 수 있음

 

Cons

- 컨텍스트에 적용되는 알고리즘이 적은 경우(1개나 2개), 알고리즘이 거의 변경이 되지 않으면 그냥 조건문을 타는 것이 편한 경우가 있음, 새로운 클래스와 인터페이스로 프로그램이 복잡해짐

- 클라이언트는 적절한 전략을 선택할 수 있도록 전략 간의 차이점을 알고 있어야 함

 

비슷한 패턴

Bridge, State, Strategy(어느 정도 Adapter도)는 매우 유사한 구조를 가지고 있음

실제로 이러한 모든 패턴은 작업을 다른 개체에서 위임하는 Composition을 기반으로 한다. (상속 사용하지 않음)

그러나 이것들은 모두 다른 문제를 해결한다.

 

Command 패턴과 Strategy 패턴은 둘 다 사용하여 일부 작업으로 개체를 매개변수화할 수 있기 때문에 비슷해 보일 수 있다. 그러나 이 둘은 매우 다른 의도를 가진다.

 

Command를 사용하여 모든 작업을 개체로 변환할 수 있다. 작업의 매개 변수는 해당 개체의 필드가 된다. 변환을 통해 작업 실행을 연기하고, 대기열에 넣고, 명령 기록을 저장하고, 원격 서비스에 명령을 보내는 등의 작업을 수행할 수 있다. 

 

반면에 Strategy은 일반적으로 동일한 작업을 실행하는 것을 다른 방법으로 설명하므로 단일 컨텍스트 클래스 내에서 이러한 알고리즘을 교환하는 것이다.

 

Decorator를 사용하면 객체의 외부를 감싸면서 추가 요소를 동적으로 더할 수 있고 Strategy를 사용하면 내장을 변경할 수 있다. 

 

Template Method는 상속(Inheritance)을 기반으로 한다. 이를 통해 하위 클래스에서 해당부분을 확장하여 알고리즘의 일부를 변경할 수 있다. Strategy은 구성(Composition)을 기반으로 한다. 해당 동작에 해당하는 다른 전략을 제공하여 객체 동작의 일부를 변경할 수 있다. 

Template Method는 클래스 레벨에서 작동하므로 정적이다. Strategy은 객체 레벨에서 동작하므로 런타임에 동작을 전환할 수 있다.

Template Method는 알고리즘의 개요를 정의, 진짜 작업 중 일부는 서브 클래스에서 처리, 알고리즘의 각 단계마다 다른 구현을 사용하면서도 알고리즘 구조 자체는 그대로 유지할 수 있음. 서브 클래스에서 일부 행동을 지정할 수 있게 해 주면서도 코드를 재사용할 수 있게 해 주는 기본 메소드를 제공

 

헤드퍼스트 디자인패턴
https://refactoring.guru/design-patterns/strategy
300x250

댓글