λμμΈν¨ν΄
[λμμΈν¨ν΄] μ λ΅(Strategy) ν¨ν΄
μμλπ
2024. 8. 24. 08:29
μ λ΅(Strategy) ν¨ν΄
- μ λ΅ ν¨ν΄(Strategy Pattern)μ κ°μ²΄μ νλ λ°©μμ μΊ‘μννμ¬ λμ μΌλ‘ κ΅μ²΄ν μ μλλ‘ νλ λμμΈ ν¨ν΄μ λλ€. μ΄ ν¨ν΄μ κ°μ²΄μ νμ(behavior)λ₯Ό ν΄λμ€λ‘ λΆλ¦¬νκ³ , λ°νμμ κ·Έ νλμ μ ννκ±°λ λ³κ²½ν μ μλλ‘ ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ½λμ μ μ°μ±κ³Ό νμ₯μ±μ λμΌ μ μμ΅λλ€.
1. μ λ΅ ν¨ν΄μ κΈ°λ³Έ κ°λ
κ΅¬μ± μμ:
- Context: νΉμ μ λ΅μ μ¬μ©νλ ν΄λΌμ΄μΈνΈ ν΄λμ€μ λλ€. μ΄ ν΄λμ€λ Strategy κ°μ²΄λ₯Ό κ°μ§κ³ μμΌλ©°, νμμ λ°λΌ μ΄λ₯Ό λ³κ²½ν μ μμ΅λλ€.
- Strategy: μ λ΅μ κ³΅ν΅ μΈν°νμ΄μ€λ₯Ό μ μν©λλ€. μ΄ μΈν°νμ΄μ€λ νΉμ μμ (νλ)μ λν΄ κ³΅ν΅λ λ©μλλ₯Ό μ μΈν©λλ€.
- Concrete Strategy: Strategy μΈν°νμ΄μ€λ₯Ό ꡬννλ ꡬ체μ μΈ μ λ΅ ν΄λμ€μ
λλ€. κ° ν΄λμ€λ νΉμ ν μκ³ λ¦¬μ¦μ΄λ νλμ ꡬνν©λλ€.
μ₯μ :
- μκ³ λ¦¬μ¦μ λ 립μ μΌλ‘ λΆλ¦¬νμ¬ μ½λ μ¬μ¬μ©μ±μ λμ΄κ³ , μ½λμ κ°λ μ±μ κ°μ ν©λλ€.
- λ°νμμ μ λ΅μ λ³κ²½ν μ μμ΄ λμ μΈ λμ λ³κ²½μ΄ κ°λ₯ν©λλ€.
- μλ‘μ΄ μ λ΅μ μΆκ°νλλΌλ κΈ°μ‘΄ μ½λλ₯Ό μμ ν νμκ° μμΌλ―λ‘ κ°λ°©-νμ μμΉ(Open-Closed Principle)μ μ€μν©λλ€.
λ¨μ :
- μ λ΅ ν΄λμ€κ° λ§μμ§ κ²½μ° κ΄λ¦¬κ° 볡μ‘ν΄μ§ μ μμ΅λλ€.
- ν΄λΌμ΄μΈνΈκ° μ μ ν μ λ΅μ μ ννλ λ‘μ§μ΄ μΆκ°λμ΄μΌ ν©λλ€.
2. μ λ΅ ν¨ν΄ μμ
μλ μμ μμλ κ°λ¨ν ν μ€νΈ μ λ ¬ νλ‘κ·Έλ¨μμ μ λ΅ ν¨ν΄μ μ μ©ν΄ λ³΄κ² μ΅λλ€. ν μ€νΈλ₯Ό μ’μΈ‘ μ λ ¬, μ°μΈ‘ μ λ ¬, μ€μ μ λ ¬νλ μ¬λ¬ κ°μ§ μ λ΅μ ꡬννκ³ , νμμ λ°λΌ λ°νμμ μ λ ¬ λ°©μμ λ³κ²½ν μ μλλ‘ ν©λλ€.
#include <iostream>
#include <memory>
#include <string>
// Strategy
class TextAlignmentStrategy {
public:
virtual void align(const std::string& text) const = 0;
virtual ~TextAlignmentStrategy() = default;
};
// Concrete Strategy - Left Alignment
class LeftAlignStrategy : public TextAlignmentStrategy {
public:
void align(const std::string& text) const override {
std::cout << text << std::endl;
}
};
// Concrete Strategy - Right Alignment
class RightAlignStrategy : public TextAlignmentStrategy {
public:
void align(const std::string& text) const override {
std::cout << std::string(50 - text.length(), ' ') << text << std::endl;
}
};
// Concrete Strategy - Center Alignment
class CenterAlignStrategy : public TextAlignmentStrategy {
public:
void align(const std::string& text) const override {
int padding = (50 - text.length()) / 2;
std::cout << std::string(padding, ' ') << text << std::endl;
}
};
// Context
class TextEditor {
private:
std::unique_ptr<TextAlignmentStrategy> alignmentStrategy;
public:
TextEditor(std::unique_ptr<TextAlignmentStrategy> strategy)
: alignmentStrategy(std::move(strategy)) {}
void setAlignmentStrategy(std::unique_ptr<TextAlignmentStrategy> strategy) {
alignmentStrategy = std::move(strategy);
}
void render(const std::string& text) const {
alignmentStrategy->align(text);
}
};
int main() {
// κΈ°λ³Έμ μΌλ‘ μΌμͺ½ μ λ ¬μ μ¬μ©
TextEditor editor(std::make_unique<LeftAlignStrategy>());
editor.render("Hello, Strategy Pattern!");
// μ€λ₯Έμͺ½ μ λ ¬λ‘ λ³κ²½
editor.setAlignmentStrategy(std::make_unique<RightAlignStrategy>());
editor.render("Hello, Strategy Pattern!");
// μ€μ μ λ ¬λ‘ λ³κ²½
editor.setAlignmentStrategy(std::make_unique<CenterAlignStrategy>());
editor.render("Hello, Strategy Pattern!");
return 0;
}
3. μ½λ μ€λͺ
- Strategy: TextAlignmentStrategyλ ν μ€νΈ μ λ ¬μ μν μ λ΅μ μΈν°νμ΄μ€μ λλ€. align() λ©μλλ ν μ€νΈλ₯Ό μ λ ¬νλ λμμ μ μν©λλ€.
- Concrete Strategy:
- LeftAlignStrategy: ν μ€νΈλ₯Ό μΌμͺ½μ μ λ ¬ν©λλ€.
- RightAlignStrategy: ν μ€νΈλ₯Ό μ€λ₯Έμͺ½μ μ λ ¬ν©λλ€.
- CenterAlignStrategy: ν μ€νΈλ₯Ό μ€μμ μ λ ¬ν©λλ€.
- Context: TextEditor ν΄λμ€λ νμ¬μ μ λ ¬ μ λ΅μ μ μ§νλ©°, render() λ©μλλ₯Ό ν΅ν΄ ν μ€νΈλ₯Ό μΆλ ₯ν λ μ¬μ©ν©λλ€. μ΄ ν΄λμ€λ setAlignmentStrategy() λ©μλλ₯Ό ν΅ν΄ λμ μΌλ‘ μ λ ¬ λ°©μμ λ³κ²½ν μ μμ΅λλ€.
4. μ€ν κ²°κ³Ό
μμ μ½λλ₯Ό μ€ννλ©΄ λ€μκ³Ό κ°μ μΆλ ₯μ΄ λνλ©λλ€:
Hello, Strategy Pattern!
Hello, Strategy Pattern!
Hello, Strategy Pattern!
- μ²μμλ LeftAlignStrategyλ₯Ό μ¬μ©νμ¬ ν μ€νΈκ° μΌμͺ½μ μ λ ¬λ©λλ€.
- λ λ²μ§Έλ‘ RightAlignStrategyλ₯Ό μ¬μ©νμ¬ ν μ€νΈκ° μ€λ₯Έμͺ½μ μ λ ¬λ©λλ€.
- λ§μ§λ§μΌλ‘ CenterAlignStrategyλ₯Ό μ¬μ©νμ¬ ν μ€νΈκ° μ€μμ μ λ ¬λ©λλ€.
μ΄ μμ λ μ λ΅ ν¨ν΄μ μ¬μ©νμ¬ ν μ€νΈ μ λ ¬ λ°©λ²μ λμ μΌλ‘ λ³κ²½νλ λ°©λ²μ 보μ¬μ€λλ€. μ λ΅ ν¨ν΄μ μ¬μ©ν¨μΌλ‘μ¨ λ€μν μ λ ¬ λ°©λ²μ μ½κ² κ΅μ²΄νκ³ νμ₯ν μ μκ² λ©λλ€.