전략 패턴에 대해서 공부를 하게 된 계기
- C++로 TextRPG를 만드는 도중 인벤토리를 만드는데 아이템의 용도에 따라 인벤토리에 아이템을 추가할 때 서로 다른 전략을 사용할 수 있지 않을까? 해서 공부해봤습니다
전략 패턴이란?
- 전략 패턴은 객체의 행위를 정의하는 알고리즘을 각각 별도의 클래스로 캡슐화하여, 런타임에 동적으로 행위를 변경할 수 있게 하는 디자인패턴이다.
전략 패턴의 구성 요소
- 전략 인터페이스(Startegy Interface)
- 행위(알고리즘)를 정의하는 인터페이스 또는 추상 클래스
- 구체적인 전략(Concrete Startegy)
- 전략 인터페이스를 구현하여 실제 알고리즘을 정의하는 클래스들
- 컨텍스트(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'C++' 카테고리의 다른 글
| C++ 연결 리스트 (0) | 2025.02.14 |
|---|---|
| C++ :: (범위 지정 연산자)란? (0) | 2025.02.12 |
| string을 매개변수로 받을 때 &를 사용하는 이유 (0) | 2025.01.07 |
| C++ 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) (0) | 2025.01.07 |
| C++ unique_ptr과 shared_ptr (0) | 2024.12.26 |