STUDY/CS

[디자인 패턴] 전략 패턴 (Strategy Pattern) / 자바스크립트

ez1n 2023. 1. 9. 23:50

전략 패턴 (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) : 컨텍스트가 사용하는 알고리즘의 변형 구현 (알고리즘, 행위, 동작을 객체로 정의한 구현체)

 

장점

  1. 메소드 중복 해결 → 알고리즘 재사용 가능
  2. 컨텍스트의 코드 변경 없이 새로운 전략 추가 (조건문 감소)
  3. 전략을 사용하는 Composition 클래스에서 서브클래싱을 하지 않아도 됨

단점

  1. 객체 수 증가 (전략으로 생성하는 객체)
  2. 각 전략들 사이의 차이점을 알아야함

 

 

❓ 서브 클래싱 (subclassing)

  • 다른 클래스의 코드를 재사용할 목적으로 상속하는 것
  • 부모와 자식 클래스의 행동이 호환되지 않으므로 자식의 인스턴스가가 부모의 인스턴스를 대체할 수 없다.
  • 구현상속 (implementation inheritance) / 클래스 상속 (class inheritance)