[java] 전략 패턴

전략 패턴은 객체지향 디자인 패턴 중 하나로, 알고리즘을 캡슐화하고 사용자가 런타임에 알고리즘을 선택할 수 있도록 하는 패턴입니다. 이 패턴을 사용하면 객체 사이의 상호작용을 유연하게 만들 수 있으며, 추상적으로 제시된 알고리즘을 쉽게 교체하거나 확장할 수 있습니다.

전략 패턴의 구성 요소

전략 패턴은 크게 세 가지 요소로 구성됩니다.

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 인터페이스를 사용하여 전략을 캡슐화하고, LowPowerModeStrategyAirplaneModeStrategy는 각각 다른 전략을 구현합니다. 애플리케이션은 런타임에 적합한 전략을 선택하여 사용할 수 있습니다.

전략 패턴의 장점

전략 패턴의 사용은 다음과 같은 장점을 가집니다:

전략 패턴은 실제로 사양에 따라 클래스 및 인터페이스를 구현하여 설계하는 방법에 대한 사용 사례를 제공합니다. 따라서 프로그래머들은 해당 패턴을 이해하고 해당 패턴을 사용해야 하는 상황에 대한 이해가 필요합니다.

참고 자료