전략 패턴(Strategy Pattern)은 알고리즘을 정의하고 캡슐화하여, 알고리즘의 교체가 필요할 때 알고리즘을 쉽게 변경하거나, 런타임에 알고리즘을 선택하고 변경하도록 하는 디자인 패턴이다.
구현
전략 패턴은
- Strategy
- Concrete Strategy
- Context
로 구성된다.
Strategy
Concrete Strategy의 인터페이스이다.
// Strategy Interface
class IStrategy
{
public:
virtual double calculate(int distance) const = 0;
};
Concrete Strategy
// Concrete Strategy Classes
class ConcreteStrategy1 : public IStrategy
{
public:
double calculate(int distance) const override
{
return distance * 0.05;
}
};
class ConcreteStrategy2 : public IStrategy
{
public:
double calculate(int distance) const override
{
return distance * 0.03;
}
};
Context
// Context
class Context
{
private:
const Strategy* strategy;
public:
Context() : strategy(nullptr) {}
// Strategy 설정 메서드
void setStrategy(const IStrategy* newStrategy)
{
strategy = newStrategy;
}
// Strategy 실행 메서드
double calculate(int distance) const
{
if (!strategy)
{
throw std::logic_error("전략이 설정되지 않았습니다.");
}
return strategy->calculate(distance);
}
};
예시
int main()
{
// 컨텍스트 생성
Context calculator;
// 기본 전략 설정
const Strategy1 strategy1;
calculator.setStrategy(&Strategy1);
...
// 전략 변경
const Strategy2 strategy2;
calculator.setStrategy(&Strategy2);
... return 0;
}
장점
- 런타임에 객체의 알고리즘을 교체할 수 있다.
- 알고리즘 코드와 알고리즘을 사용하는 코드를 분리할 수 있다.
- 상속을 합성으로 대체할 수 있다.
- 개방/폐쇄 원칙을 지킨다. Context를 변경하지 않아도 새로운 Strategy를 도입할 수 있다.
단점
- 알고리즘이 얼마 없다면 굳이 사용하는 것이 더 복잡해진다.
반응형