디자인 패턴
[Design Pattern] 전략 패턴
감자b
2024. 12. 25. 00:30
전략 패턴이란 알고리즘을 캡슐화하여 런타임 중 객체 동작을 동적으로 교체할 수 있도록 설계하는 디자인 패턴을 의미한다.
객체의 행위를 정의하는 알고리즘을 별도의 클래스로 분리, 이를 사용하는 객체(Context)가 특정 행동(Strategy)을 주입받아서 실행한다.
전략 패턴의 주요 구성 요소

1. Strategy(전략 인터페이스)
- 알고리즘(행동)을 정의하는 공통 인터페이스.
- 다양한 구체 전략(Concrete Strategies)들이 해당 인터페이스를 구현하여 각기 다른 알고리즘을 제공.
public interface Strategy {
void execute();
}
2. ConcreteStrategy(구체적인 전략)
- Strategy 인터페이스를 구현하며, 알고리즘(행동)을 정의.
class StrategyA implements Strategy {
@Override
public void execute() {
System.out.println("A execute");
}
}
class StrategyB implements Strategy {
@Override
public void execute() {
System.out.println("B execute");
}
}
3. Context(문맥)
- Strategy 객체를 사용하여 행동을 실행하는 역할.
- Strategy 객체를 외부에서 주입받아 동적으로 행동을 변경할 수 있음.
- Context는 변하지 않는 부분, strategy 를 통해 일부 전략을 변경
public class Context {
private final Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void execute() {
start();
strategy.execute();
end();
}
private void start() {
System.out.println("start");
}
private void end() {
System.out.println("end");
}
}
4. Client
- 특정 전략(ConcreteStrategy)을 컨텍스트에 전달
- 전략을 등록, 변경하는 역할을 한다.
public class Client {
public static void main(String[] args) {
Context contextA = new Context(new StrategyA());
System.out.println("Executing StrategyA");
contextA.executeTemplate();
Context contextB = new Context(new StrategyB());
System.out.println("Executing StrategyB");
contextB.executeTemplate();
}
}
전략 패턴의 장단점
장점
- 캡슐화
- 알고리즘(행동)을 별도의 클래스(ConcreteStrategy)로 분리하여 관리.
- → Context의 변경 없이 알고리즘 확장, 교체 가능. (OCP 준수)
- 프로그램 실행 중에 필요에 따라 적절한 전략을 선택하거나 교체할 수 있음.
단점
- 알고리즘마다 별도의 클래스를 생성해야 하므로 복잡성이 증가
- 클라이언트가 구체적인 전략을 알아야 한다.
여기서 의존성 주입을 활용하면 클라이언트가 구체 전략에 대해 알 필요가 없도록 구현 가능하다.
전략 패턴 vs 템플릿 메서드 패턴
[Design Pattern] 템플릿 메서드 패턴
템플릿 메서드 패턴이란 여러 클래스에서 공통으로 사용하는 메서드(변하지 않는 기능)를 템플릿이라는 상위 클래스에 정의하고 세부 동작을 하위 클래스에서 구현하도록 하는 패턴이다.Abstract
hbb-devlog.tistory.com
전략 패턴
- 객체 구성(컴포지션)을 통해 알고리즘 변경
- 주로 인터페이스 사용하므로 다중 상속이 가능
- 런타임에 전략을 교체할 수 있음
템플릿 메서드 패턴
- 상속을 통해 알고리즘 일부 변경
- 주로 추상 클래스를 사용하므로 단일 상속만 가능, 템플릿에 알고리즘이 종속적
- 상속 시점에 알고리즘 구조가 결정됨