The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. 

Strategy lets the algorithm vary independently from clients that use it.

 

Strategy Pattern 은 알고리즘군을 정의하고, 그 알고리즘들을 서로 바꿔가면서 쓸 수 있게 하는 패턴이다.

각 알고리즘은 캡슐화되어 있기 때문에 클라이언트에서 손쉽게 서로 다른 알고리즘을 사용할 수 있다. 이때, 클라이언트들에게 객체 구성을 통해 알고리즘 구현을 선택할 수 있게 해준다. (유연하다)

 

 

 

Duck class에 fly 와 quack 기능을 추가한다고 하자. 이때, 어떤 상속 클래스들은 날 수 없을 수도 있고, 어떤 클래스들은 꽥꽥 울 수 없다.

만약 단순하게 Child class 에서 fly 와 quack 메소드를 오버라이드 하게 되면 변경이 있을 때마다 모든 서브클래스를 살펴봐야 한다.

 

 

 

이러한 경우, 아래와 같이 오리마다 달라지는 부분과 그렇지 않은 부분을 분리하고,

오리를 정의할 때 동적으로 flyBehavior/quackBehavior 알고리즘을 선택할 수 있도록 하는 것이 Strategy 패턴이다.

Q. Behavior을 만들 때 왜 인터페이스를 쓰는 것일까?
= 상위 형식에 맞추어 프로그래밍
= 실제 실행 시에 쓰이는 객체가 코드에 의해 고정되지 않는다 (다형성)
= 클라이언트측에서 사용할 때, 실제 객체 형식을 몰라도 된다
Q. 다형성이란?

같은 모양의 코드가 다른 행위를 하는 것 (OCP, DIP 와 관련) => 중복을 줄이며 변경 확장에 유연하다
방법 1) Overriding
- 슈퍼클래스를 상속받은 서브클래스에서 슈퍼클래스의 (추상)메소드를 같은 이름, 리턴값, 인자이나 새로운 로직으로 정의
- 런타임 시점 선택

방법 2) Overloading
- 하나의 클래스에서 같은 이름의 다른 인자를 가진 메소드들을 여러개 정의
- 컴파일 시점 선택
- ex) 생성자 오버로딩

방법 3) 함수형 인터페이스
- 람다식을 사용하기 위한 API로, 자바에서 인터페이스에 구현할 메소드가 1개일 때를 말함
- ex) enum 계산기

출처 - https://brunch.co.kr/@kd4/4

 

 

장점

  • 런타임에 개체 내부에서 사용되는 알고리즘을 교환할 수 있다.
  • 알고리즘을 사용하는 코드에서 알고리즘의 구현 세부 정보를 분리할 수 있다.
  • 상속을 구성으로 대체할 수 있다.
  • 개방/폐쇄 원칙 => 컨텍스트를 변경하지 않고도 새로운 전략을 도입할 수 있다.

단점

  • 알고리즘이 몇 개만 있고 거의 변경되지 않는 경우 오히려 복잡해진다.

언제 사용하는가? 

  • 객체 내에서 다양한 알고리즘 변형을 사용하고 런타임 중에 한 알고리즘에서 다른 알고리즘으로 전환할 수 있도록 하려는 경우 
  • 일부 동작을 실행하는 방식만 다른 유사한 클래스가 많이 있는 경우 (c.f. 템플릿 메소드 패턴)
  • 클래스에 동일한 알고리즘의 다른 변형 간에 전환하는 대규모 조건부 연산자가 있는 경우

'책을 읽자 > Design Patterns' 카테고리의 다른 글

Proxy pattern  (0) 2021.08.18
Decorator Pattern  (0) 2021.08.18
Template Method Pattern  (0) 2021.08.02
Flyweight Pattern  (0) 2021.01.19
Bridge Pattern  (0) 2021.01.19

+ Recent posts