전략 패턴은 객체지향 디자인 패턴 중 하나로, 알고리즘을 캡슐화하고 사용자가 런타임에 알고리즘을 선택할 수 있도록 하는 패턴입니다. 이 패턴을 사용하면 객체 사이의 상호작용을 유연하게 만들 수 있으며, 추상적으로 제시된 알고리즘을 쉽게 교체하거나 확장할 수 있습니다.
전략 패턴의 구성 요소
전략 패턴은 크게 세 가지 요소로 구성됩니다.
1. 전략(Strategy)
전략은 인터페이스 혹은 추상 클래스로 정의된 알고리즘을 나타냅니다. 여러 가지 구체적인 알고리즘 클래스가 이를 구현하여 변형된 알고리즘을 정의할 수 있습니다.
2. 컨텍스트(Context)
컨텍스트는 전략을 사용하는 역할을 합니다. 전략을 적용하고 실행하는 주체로, 여러 전략 중 하나를 선택하여 해당 전략을 실행합니다.
3. 구체적인 전략 구현체
구체적인 전략 구현체들은 실제로 전략을 정의하고, 컨텍스트에서 호출될 때 실행됩니다.
전략 패턴의 예시
어떻게 전략 패턴이 사용되는지 간단한 예제를 통해 살펴봅시다. 여기서는 스마트폰 애플리케이션의 배터리 사용량을 최적화하는 기능을 구현하는 것을 가정하겠습니다.
// 전략: BatterySaverStrategy 인터페이스
public interface BatterySaverStrategy {
void applyBatterySaverMode();
}
// 구체적인 전략 구현체: LowPowerModeStrategy 클래스
public class LowPowerModeStrategy implements BatterySaverStrategy {
@Override
public void applyBatterySaverMode() {
// 저전력 모드를 활성화하는 코드
}
}
// 구체적인 전략 구현체: AirplaneModeStrategy 클래스
public class AirplaneModeStrategy implements BatterySaverStrategy {
@Override
public void applyBatterySaverMode() {
// 비행기 모드를 활성화하는 코드
}
}
// 컨텍스트: PhoneApp 클래스
public class PhoneApp {
private BatterySaverStrategy strategy;
public void setBatterySaverStrategy(BatterySaverStrategy strategy) {
this.strategy = strategy;
}
public void enableBatterySaver() {
strategy.applyBatterySaverMode();
}
}
위의 예시에서 PhoneApp
클래스는 BatterySaverStrategy
인터페이스를 사용하여 전략을 캡슐화하고, LowPowerModeStrategy
와 AirplaneModeStrategy
는 각각 다른 전략을 구현합니다. 애플리케이션은 런타임에 적합한 전략을 선택하여 사용할 수 있습니다.
전략 패턴의 장점
전략 패턴의 사용은 다음과 같은 장점을 가집니다:
- 알고리즘이 독립적으로 변경 가능하며 쉽게 확장할 수 있습니다.
- 객체 간의 의존성을 줄여 유지보수가 용이합니다.
- 동일한 인터페이스를 통해 여러 알고리즘을 적용할 수 있습니다.
전략 패턴은 실제로 사양에 따라 클래스 및 인터페이스를 구현하여 설계하는 방법에 대한 사용 사례를 제공합니다. 따라서 프로그래머들은 해당 패턴을 이해하고 해당 패턴을 사용해야 하는 상황에 대한 이해가 필요합니다.
참고 자료
- “Head First Design Patterns” - 에릭 프리먼, 엘리자베스 프리먼, 캐서린 시에라, 버트 베이츠
- “Design Patterns: Elements of Reusable Object-Oriented Software” - 에릭 감마, 리처드 헬름, 랄프 존슨, 존 블리시디스