전략 패턴이란?
전략 패턴은 알고리즘의 패밀리를 정의해 캡슐화하고 서로 교환 가능하게 하는 패턴이다. 따라서, 런타임 중에 알고리즘 전략을 선택해 객체 동작을 실시간으로 바뀌도록 할 수 있게 한다. 어떤 일을 수행하는 알고리즘이 여러가지일때 알고리즘 변형이 빈번하게 필요한 경우에 적합하다.
전략 패턴 사용 법
- ConcreteStarategy: 알고리즘, 행위, 동작을 객체로 정의한 구현체
- Strategy 인터페이스 : 모든 전략 구현제에 대한 상위 인터페이스
- Context : 알고리즘을 실행해야 할 때마다 해당 알고리즘과 연결된 전략 객체의 메소드를 호출.
- 클라이언트 : 특정 전략 객체를 컨텍스트에 전달 함으로써 전략을 등록하거나 변경하여 전략 알고리즘을 실행한 결과를 누린다.
// 전략(추상화된 알고리즘)
interface Strategy {
void strategyMethod();
}
// 전략 알고리즘 1
class ConcreteStratey1 implements Strategy {
public void strategyMethod() {}
}
// 전략 알고리즘 2
class ConcreteStratey2 implements Strategy {
public void strategyMethod() {}
}
//전략 알고리즘 3
class ConcreteStratey3 implements Strategy {
public void strategyMethod() {}
}
// 컨텍스트(전략 등록/실행)
class Context {
Strategy Strategy; // 전략 인터페이스를 합성(composition)
// 전략 교체 메소드
void setStrategy(Strategy Strategy) {
this.Strategy = Strategy;
}
// 전략 실행 메소드
void contextMethod() {
this.Strategy.strategyMethod();
}
}
// 클라이언트(전략 교체/전략 실행한 결과를 얻음)
class Client {
public static void main(String[] args) {
// 1. 컨텍스트 생성
Context c = new Context();
// 2. 전략 설정
c.setStrategy(new ConcreteStratey1());
// 3. 전략 실행
c.strategyMethod();
// 4. 다른 전략 설정
c.setStrategy(new ConcreteStratey2());
// 5. 다른 전략 시행
c.strategyMethod();
}
}
패턴 사용 시기
- 알고리즘 코드가 노출되어서는 안 되는 데이터에 액세스하거나 데이터를 활용할 때
- 알고리즘의 동작이 런타임에 교체되어야 할 떄
패턴 장점
Solid 원칙의 OCP원칙, DIP원칙과 합성, 다형성, 캡슐화 등 OOP기술의 총 집합 버전!!
패턴 단점
- 알고리즘이 많아질수록 관리해야 할 객체의 수가 늘어난다.
- 적절한 전략을 선택하기 위해 전략 간의 차이점을 파악하고 있어야 한다.
전략 패턴 vs 템플리 메소드 패턴
전략 패턴 | 템플릿 메소드 패턴 | |
공통점 | 알고리즘을 때에 따라 적용한다. OCP원칙을 충족한다. |
|
차이점 | 위임을 통해 | 상속을 통해 |
객체 간의 결합이 느슨 | 두 모듈이 더 밀접하게 결합 | |
주로 인터페이스를 사용 | 주로 추상 클래스나 구체적인 클래스를 사용 | |
전체 전략 알고리즘을 변경 | 알고리즘의 일부만 변경 |
전략 패턴 vs 상태 패턴
전략 패턴 | 상태 패턴 | |
공통점 | 클래스 다이어그램과 코드 사용법이 유사 합성을 통해 상속의 한계를 극복 난잡한 조건 분기를 극복하기 위해 전략, 상태 형태를 객체화 객체의 일련의 행동이 캡슐화 (State는 Strategy의 확장으로 간주될 수 있음) |
|
차이점 | 알고리즘을 객체화하여 클라이언트에서 유연적으로 전략을 제공/교체 | 객체의 상태를 객체화하여 클라이언트와 상태 클래스 내부에서 다른 상태로 교체를 한다. |
전략 객체는 그 전략만의 알고리즘 동작을 정의 및 수행한다. (만일 전략을 상태화 하면 클래스 폭발이 일어날 수 있다 | 상태 객체는 상태가 적용되는 대상 객체가 할 수 있는 일련의 모든 행동들을 정의 및 수행한다. | |
전략 객체는 입력값에 따라 전략 형태가 다양하게 될 수 있으니 인스턴스로 구성한다. | 상태 객체는 정의된 상태를 서로 스위칭 하기에 메모리 절약을 위해 싱글톤으로 구성한다. |
'CS > Design Pattern' 카테고리의 다른 글
데코레이터 패턴 (Decorater Pattern) (0) | 2024.06.10 |
---|---|
커맨드 패턴 (Command Pattern) (0) | 2024.06.10 |
상태 패턴 (State pattern) (0) | 2024.06.10 |
템플릿 메소드 패턴 (Template Method Pattern) (1) | 2024.06.09 |
메멘토 패턴 (Memento Pattern) (0) | 2024.06.09 |