전략 패턴에 대해서 공부를 하게 된 계기

  • C++로 TextRPG를 만드는 도중 인벤토리를 만드는데 아이템의 용도에 따라 인벤토리에 아이템을 추가할 때 서로 다른 전략을 사용할 수 있지 않을까? 해서 공부해봤습니다

전략 패턴이란?

  • 전략 패턴은 객체의 행위를 정의하는 알고리즘을 각각 별도의 클래스로 캡슐화하여, 런타임에 동적으로 행위를 변경할 수 있게 하는 디자인패턴이다.

전략 패턴의 구성 요소

  1. 전략 인터페이스(Startegy Interface)
    • 행위(알고리즘)를 정의하는 인터페이스 또는 추상 클래스
  2. 구체적인 전략(Concrete Startegy)
    • 전략 인터페이스를 구현하여 실제 알고리즘을 정의하는 클래스들
  3. 컨텍스트(Context)
    • 전략 객체를 사용하는 클래스. 이 클래스는 전략 객체를 통해 특정 행위를 실행한다.

 

예제 - 전략 패턴을 이용한 정렬 알고리즘

 

#include <iostream>
#include <vector>
#include <algorithm> // std::sort
#include <memory> // std::unique_ptr

// 1. 전략 인터페이스
class SortStrategy {
public:
    virtual void sort(std::vector<int>& data) = 0;
    virtual ~SortStrategy() = default;
};

// 2. 구체적인 전략
class BubbleSort : public SortStrategy {
public:
    void sort(std::vector<int>& data) override {
        for(size_t i = 0; i < data.size(); ++i) {
            for(size_t j = 0; j < data.size() - i - 1; ++j) {
                if(data[j] > data[j + 1]) {
                    std::swap(data[j], data[j + 1]);
                }
            }
        }
        std::cout << "버블 정렬 사용.\n";
    }
};

class QuickSort : public SortStrategy {
public:
    void sort(std::vector<int>& data) override {
        std::sort(data.begin(), data.end());
        std::cout << "퀵 정렬 사용.\n";
    }
};

// 3. 컨텍스트
class SortContext {
private:
    std::unique_ptr<SortStrategy> strategy;
public:
    void setStrategy(std::unique_ptr<SortStrategy> newStrategy) {
        strategy = std::move(newStrategy);
    }
    void executeSort(std::vector<int>& data) {
        if(strategy) {
            strategy->sort(data);
        } else {
            std::cerr << "No strategy set!\n";
        }
    }
};

int main() {
    std::vector<int> data = {58, 20, 34, 12, 49};
    
    SortContext context;
    
    // 버블 정렬 사용
    context.setStrategy(std::make_unique<BubbleSort>());
    context.executeSort(data);
    
    for (const auto& num : data) std::cout << num << " ";
    std::cout << "\n";
    
    data = {58, 20, 34, 12, 49};
    
    // 퀵 정렬 사용
    context.setStrategy(std::make_unique<QuickSort>());
    context.executeSort(data);
    
    for (const auto& num : data) std:: cout << num << " ";
    std::cout << "\n";
    
    return 0;
}

// 실행 결과
버블 정렬 사용.
12 20 34 49 58
퀵 정렬 사용
12 20 34 49 58

+ Recent posts