반응형
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 함수에 데이터를 넘길 때 참조를 사용해 큰 사이즈의 데이터가 전달될 때 성능 저하를 최소화 함
반응형
'개발 > C++' 카테고리의 다른 글
c++에서 http호출을 쉽게해보자! cpp-httplib 연동하기 (0) | 2023.06.16 |
---|---|
3. c# string을 c++ DLL로 전달하는 방법 (0) | 2023.02.01 |
2. C++ DLL을 C#에서 이용하기 (0) | 2023.01.31 |
1. VS 2019에서 C++ 프로젝트를 DLL로 빌드하기 (0) | 2023.01.31 |
C++ 람다 함수 정리 (1) | 2023.01.25 |