전략 패턴(Strategy Pattern)은 알고리즘군을 정의하고 캡슐화
해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해준다.
전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다.
예시
- 오리는 날거나 날지 못하는 상태 (FlyBehavior.interface)
- 오리가 소리를 내거나 못내는 상태 (QuackBehavior.interface)
→ 오리는 두 가지 상태가 있다.
→ A는 B(알고리즘군)가 있다.
→ 구성 O (Composition), 상속 X여기서 알고리즘군은 FlyBehavior, QuackBehavior 처럼
상태가 변하는 행동
이다.이렇게 상태가 변하는 행동들을 인터페이스로 두고 인터페이스에 따른 구현체 클래스를 만든 후, 슈퍼 클래스는 이 인터페이스(구현체를 의존성 주입)를 사용한다.
상태가 변하는 행동들을 인터페이스로 두고 인터페이스에 따른 구현체를 만든 후, 슈퍼 클래스는 이 인터페이스를 사용한다.
전략 패턴은 객체 내에서 한 알고리즘의 다양한 변형들을 사용하고 싶을 때
, 그리고 런타임 중에 한 알고리즘에서 다른 알고리즘으로 전환하고 싶을 때
사용한다.
전략 패턴은 다양한 행동들을 별도의 클래스 계층구조로 추출하고, 추출된 클래스들을 하나의 인터페이스로 결합하여 중복 코드를 줄인다.
모든 알고리즘을 같은 인터페이스를 구현하는 별도의 클래스들로 추출하여 조건문을 제거할 수 있다.
슈퍼클래스는 알고리즘의 모든 변형들을 구현하는 대신 추출된 객체들 중 하나에 실행을 위임한다. (생성자, 필드, setter 주입)
전략 패턴을 이용하면
슈퍼클래스를 전혀 건드리지 않고 새로운 행동을 추가 할 수 있다.
> 행동 패턴
객체지향 원칙
- 바뀌는 부분은
캡슐화
한다.- 상속 보다는
구성(Composition)
을 활용한다.- 구현보다는
인터페이스에 맞춰서
프로그래밍한다.