개발/C++

[Design Pattern] Strategy Pattern(전략 패턴) 정리

njsung 2023. 11. 6. 16:37
반응형

Strategy Pattern의 정의

  • Strategy Pattern(전략 패턴)은 특정 클래스의 행위를 변경하고 싶을 때 사용하는 디자인 패턴
  • 알고리즘을 객체의 형태로 캡슐화하여, 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있음
  • 동일한 문제를 해결할 수 있는 여러 알고리즘을 정의하고, 런타임에 알고리즘을 선택할 수 있도록 하는 방식

개념

  • Context(문맥): 전략을 사용하는 역할 / 필요에 따라 다른 전략을 사용하도록 설정할 수 있음
  • Strategy(전략): 여러 알고리즘을 인터페이스로 정의 / Context에서 사용할 수 있는 메소드 또는 알고리즘 제공
  • ConcreteStrategy(구체적인 전략): Strategy 인터페이스를 실제로 구현하는 클래스 / 각기 다른 알고리즘을 구현

구현 방법 및 예제

구현 단계는 다음과 같이 정의할 수 있음

  • Strategy 인터페이스를 정의
  • 여러 ConcreteStrategy 클래스를 정의하여 Strategy 인터페이스를 구현
  • Context 클래스를 정의하고, Strategy 객체를 포함하도록 구현
  • Context 객체에서 사용할 Strategy 객체를 설정하고, 필요에 따라 변경할 수 있게 구현
728x90

예제

  • 여러가지 소팅 알고리즘을 미리 구현해두고 데이터 사이즈에 맞춰서 적합한 소팅 알고리즘을 선택하는 예시
#include <iostream>
#include <memory>
#include <vector>

// Strategy 인터페이스
class SortingStrategy {
public:
    virtual ~SortingStrategy() {}
    virtual void sort(std::vector<int> &data) const = 0;
};

// ConcreteStrategy A
class BubbleSort : public SortingStrategy {
public:
    void sort(std::vector<int> &data) const override {
        // 버블 정렬 알고리즘 구현...
        std::cout << "Bubble sort algorithm is applied.\n";
    }
};

// ConcreteStrategy B
class QuickSort : public SortingStrategy {
public:
    void sort(std::vector<int> &data) const override {
        // 퀵 정렬 알고리즘 구현...
        std::cout << "Quick sort algorithm is applied.\n";
    }
};

// Context 클래스
class SortedArray {
private:
    std::unique_ptr<SortingStrategy> strategy_;
public:
    SortedArray(std::unique_ptr<SortingStrategy> strategy) : strategy_(std::move(strategy)) {}
    void set_strategy(std::unique_ptr<SortingStrategy> strategy) {
        strategy_ = std::move(strategy);
    }
    void sort(std::vector<int> &data) {
        strategy_->sort(data);
    }
};

int main() {
    std::vector<int> data = {5, 3, 8, 6, 2, 7, 1, 4};

	// 정렬되기 전 데이터 출력
    std::cout << "before sorting" << std::endl;
    for (int value : data) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

	SortedArray array(nullptr);

    // 데이터 크기에 따라 전략 설정
    if(data.size() < 100) {
        array.set_strategy(std::make_unique<BubbleSort>());
    }
    else {
        array.set_strategy(std::make_unique<QuickSort>());
    }

    array.sort(data);

    // 정렬된 데이터 출력
    std::cout << "after sorting" << std::endl;
    for (int value : data) {
        std::cout << value << " ";
    }
    std::cout << std::endl;
    
    return 0;
}
  • 핵심 구현 요소
    • 미리 SortedArray 객체를 만들어두고 상황에 따라 적합한 전략을 설정하도록 구현
    • sort 함수에 데이터를 넘길 때 참조를 사용해 큰 사이즈의 데이터가 전달될 때 성능 저하를 최소화 함
반응형