전략 패턴 (Strategy Pattern)
동일한 계열의 알고리즘들을 개별적으로 캡슐화하여 상호 교환할 수 있게 정의하는 패턴
- 하나의 클래스가 많은 행동들을 정의하고, 클래스 연산 안에서 복잡한 다중 조건문의 모습을 취하는 경우 사용
- 독립적으로 원하는 알고리즘 선택하여 사용
- 클라이언트에 영향 없이 알고리즘 변경
예제
// Strategy Interface
class MovableStrategy {
constructor(strategy) {
this.way = strategy.way;
}
move() {
console.log(`${this.way}를 통해 이동합니다.`)
}
}
// Concrete Strategies
class RailStrategy extends MovableStrategy {
constructor() {
super({ way: '선로' });
}
}
class LoadStrategy extends MovableStrategy {
constructor() {
super({ way: '도로' });
}
}
// Context
// 알고리즘이 어떻게 실행되는지, 어떤 유형의 전략과 함께 작동하는지 알지 못함
class Context {
constructor(strategy) {
this.movableStrategy = strategy;
}
move() {
this.movableStrategy.move();
}
}
const bus = new Context(strategy);
bus.move(new RailStrategy()); // 선로를 통해 이동합니다.
bus.move(new LoadStrategy()); // 도로를 통해 이동합니다.
- 컨텍스트 (Context) : 알고리즘을 실행해야할 때 해당 알고리즘과 연결된 전략 객체의 메소드 호출
- 전략 인터페이스 (Strategy Interface) : 컨텍스트가 전략을 실행하는 데 사용하는 메서드 선언
- 구상 전략 (Concrete Strategy) : 컨텍스트가 사용하는 알고리즘의 변형 구현 (알고리즘, 행위, 동작을 객체로 정의한 구현체)
장점
- 메소드 중복 해결 → 알고리즘 재사용 가능
- 컨텍스트의 코드 변경 없이 새로운 전략 추가 (조건문 감소)
- 전략을 사용하는 Composition 클래스에서 서브클래싱을 하지 않아도 됨
단점
- 객체 수 증가 (전략으로 생성하는 객체)
- 각 전략들 사이의 차이점을 알아야함
❓ 서브 클래싱 (subclassing)
- 다른 클래스의 코드를 재사용할 목적으로 상속하는 것
- 부모와 자식 클래스의 행동이 호환되지 않으므로 자식의 인스턴스가가 부모의 인스턴스를 대체할 수 없다.
- 구현상속 (implementation inheritance) / 클래스 상속 (class inheritance)
'STUDY > CS' 카테고리의 다른 글
[네트워크] TCP/IP 4계층 (0) | 2023.01.21 |
---|---|
[네트워크] 네트워크 토폴로지 (Network Topology) / 네트워크 분류 (2) | 2023.01.20 |
[디자인 패턴] 옵서버 패턴 (Observer Pattern) / 자바스크립트, 프록시 객체 (2) | 2023.01.10 |
[디자인 패턴] 팩토리 패턴 (Factory Pattern) - 팩토리 메소드, 추상 팩토리 / 자바스크립트 (0) | 2023.01.08 |
[디자인 패턴] 싱글톤 패턴 (Singleton Pattern) / 자바스크립트 (2) | 2023.01.07 |