Programming Languange/디자인 패턴

디자인 패턴 (Design Patterns) - 전략 패턴

타자치는 문돌이

전략 패턴(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를 도입할 수 있다.

단점

  • 알고리즘이 얼마 없다면 굳이 사용하는 것이 더 복잡해진다.

 

디자인 패턴 (Design Patterns) - Index