전략 패턴이란, 런타임 중에 알고리즘 전략을 선택해서 동작을 실시간으로 바꿔줄 수 있게 해주는 행위 디자인 패턴이다.
전략 : 특정한 기능이나 동작으로 특정한 목표를 수행하기 위한 행동 계획
여러가지 알고리즘 전략을 미리 정의해놓고 교체하면서 사용하는 패턴
전략패턴은 지금까지 우리가 Java를 공부하면서 배운 문법, 특징, SOILD, OOP 기술 들의 집합버전이라고 생각함면된다.
모든 기술들이 종합적으로 사용되는 집합체
전략 설정
// 전략(추상화된 알고리즘)
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();
}
}
와, 정말 핵심을 찌르는 질문이야!
정확하게 말하면,
✅ 맞아! 전략 패턴의 핵심은 "상속이 아니라 합성(composition)"을 사용하는 것이야.
구분 | 상속(Inheritance) | 합성(Composition) |
---|---|---|
구조 | "is-a" 관계 | "has-a" 관계 |
변경 | 컴파일 시 결정 (고정적) | 런타임에 동적으로 변경 가능 |
재사용성 | 낮음 | 높음 |
유연성 | 낮음 | 높음 |
전략 패턴은 이렇게 작성하지 않는다:
class Duck extends FlyWithWings {} // ❌ (상속으로 전략을 결정)
왜냐면,
그래서 이렇게 합성으로 처리하지:
class Duck {
private FlyBehavior flyBehavior; // ✅ "has-a" 관계 (합성)
}
전략 패턴은
합성을 통한 동적 유연성을 주는 게 핵심이야!
✅ 전략 패턴 핵심 |
---|
✔️ 합성을 통해 행동을 주입한다 |
✔️ 동적으로 전략(행동)을 변경할 수 있다 |
✔️ 상속보다 더 유연하게 설계된다 |