π‘ μ λ΅(Strategy) ν¨ν΄μ΄λ?
μκ³ λ¦¬μ¦λ€μ ν¨λ°λ¦¬λ₯Ό μ μνκ³ , κ° ν¨λ°λ¦¬λ₯Ό λ³λμ ν΄λμ€μ λ£μ ν κ·Έλ€μ κ°μ²΄λ€μ μνΈκ΅νν μ μλλ‘ νλ νλ λμμΈ ν¨ν΄μ λλ€. μ€ν(λ°νμ) μ€μ μκ³ λ¦¬μ¦ μ λ΅μ μ ννμ¬ κ°μ²΄ λμμ μ€μκ°μΌλ‘ λ°λλλ‘ ν μ μμ΅λλ€. μ¦, μ΄λ€ μΌμ μννλ μκ³ λ¦¬μ¦μ΄ μ¬λ¬κ°μ§μΌ λ, λμλ€μ 미리 μ λ΅μΌλ‘ μ μν¨μΌλ‘μ¨ μμ½κ² μ λ΅μ κ΅μ²΄ν μ μκ² ν©λλ€. λ°λΌμ μκ³ λ¦¬μ¦ λ³νμ΄ λΉλ²νκ² νμν κ²½μ°μ μ ν©ν©λλ€.
GoFμ λμμΈ ν¨ν΄ μ± μμλ μ λ΅ ν¨ν΄μ λ€μκ³Ό κ°μ΄ μ μν©λλ€.
- λμΌ κ³μ΄μ μκ³ λ¦¬μ¦κ΅°μ μ μνκ³
- κ°κ°μ μκ³ λ¦¬μ¦μ μΊ‘μννλ©°,
- μκ³ λ¦¬μ¦μ μ¬μ©νλ ν΄λΌμ΄μΈνΈμ μκ΄μμ΄ λ 립μ μΌλ‘
- μκ³ λ¦¬μ¦μ λ€μνκ² λ³κ²½ν μ μκ² νλ€.
μ¦, μ λ΅ ν¨ν΄μ SOLID μμΉμ OCP μμΉ, DIP μμΉ, ν©μ±(compositoin), λ€νμ±(polymorphism), μΊ‘μν(encapsulation) λ± OOP κΈ°μ λ€μ μ΄ μ§ν© λ²μ μ λλ€.
π‘ ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μΌλ‘ λ³Έ μ λ΅ ν¨ν΄
- Context : Strategyλ₯Ό μ΄μ©νλ μμ€ν μΌλ‘, μκ³ λ¦¬μ¦ μ λ΅ κ°μ²΄λ₯Ό ν©μ±(composition)νμ¬ κ°μ§κ³ μμ΅λλ€. ν΄λΌμ΄μΈνΈλ‘λΆν° μμ²λ°μΌλ©΄ Stretegy κ°μ²΄μ νμ μ€νμ μμν©λλ€.
- Strategy Interface : μ λ΅μ μΆμνν μΈν°νμ΄μ€μ λλ€.
- Concrete State : μκ³ λ¦¬μ¦, νμ, λμμ κ°μ²΄λ‘ μ μν ꡬν체λ‘, μ½ν μ€νΈκ° μ¬μ©νλ μκ³ λ¦¬μ¦μ λ€μν λ³νλ€μ ꡬνν©λλ€.
π‘ μ λ΅ ν¨ν΄ ꡬν
// μ λ΅(μΆμνλ μκ³ λ¦¬μ¦)
interface IStrategy {
void doSomething();
}
// μ λ΅ μκ³ λ¦¬μ¦ A
class ConcreteStrateyA implements IStrategy {
public void doSomething() {}
}
// μ λ΅ μκ³ λ¦¬μ¦ B
class ConcreteStrateyB implements IStrategy {
public void doSomething() {}
}
// 컨ν
μ€νΈ(μ λ΅ λ±λ‘/μ€ν)
class Context {
IStrategy Strategy; // μ λ΅ μΈν°νμ΄μ€λ₯Ό ν©μ±(composition)
// μ λ΅ κ΅μ²΄ λ©μλ
void setStrategy(IStrategy Strategy) {
this.Strategy = Strategy;
}
// μ λ΅ μ€ν λ©μλ
void doSomething() {
this.Strategy.doSomething();
}
}
// ν΄λΌμ΄μΈνΈ(μ λ΅ κ΅μ²΄/μ λ΅ μ€νν κ²°κ³Όλ₯Ό μ»μ)
class Client {
public static void main(String[] args) {
// 1. 컨ν
μ€νΈ μμ±
Context c = new Context();
// 2. μ λ΅ μ€μ
c.setStrategy(new ConcreteStrateyA());
// 3. μ λ΅ μ€ν
c.doSomething();
// 4. λ€λ₯Έ μ λ΅ μ€μ
c.setStrategy(new ConcreteStrateyB());
// 5. λ€λ₯Έ μ λ΅ μν
c.doSomething();
}
}
π‘ λ§λ¬΄λ¦¬
μ λ΅ ν¨ν΄μ
- κ°μ²΄ λ΄μμ ν μκ³ λ¦¬μ¦μ λ€μν λ³νλ€μ μ¬μ©νκ³ μΆμ λ
- λ°νμ μ€μ ν μκ³ λ¦¬μ¦μμ λ€λ₯Έ μκ³ λ¦¬μ¦μΌλ‘ μ ννκ³ μΆμ λ
- μΌλΆ νλμ μ€ννλ λ°©μμμλ§ μ°¨μ΄κ° μλ μ μ¬ν ν΄λμ€λ€μ΄ λ§μ λ
μ μ¬μ©ν μ μμ΅λλ€.
μ λ΅ ν¨ν΄μ μ¬μ©νλ©΄ μκ³ λ¦¬μ¦μ μ¬μ©νλ μ½λμμ μκ³ λ¦¬μ¦μ ꡬν μΈλΆ μ 보λ€μ κ³ λ¦½ν μ μκ³ , μ½ν μ€νΈλ₯Ό λ³κ²½νμ§ μκ³ λ μλ‘μ΄ μ λ΅λ€μ λμ ν μ μμ΅λλ€.(OCP μ€μ)