Study

[디자인패턴 - javascript] 파트2

wookjae 2024. 10. 27. 21:03

☆Strategy(전략가) 패턴  - 그때그때 상황에 맞게 갈아 끼울 수 있는 패턴   ★

. 하나의 패턴으로 여러가지 방식을 모두 실행 해 볼 수 있다. 

. 커맨드패턴은 객체를 갈아낄수 없지만. 전략가 패턴은 갈아끼울 수있다. 

. 여러가지 방식을 갈아껴서 실행하고 싶을 때 사용하면 좋습니다. 

. 하나의 문제사항을 다양한 알고리즘으로 풀어서 처리하는 속도(비용)을 비교할 수 있다.

 

 
// Strategy(전략가) 패턴은 생성자에서 셋팅 및 수행을 하지 않음..
class StrategyRunner {
  constructor() {}
  // Setter함수를 통해서 전략을 설정 후
  setStrategy(strat) {
    this.strategy = strat;
  }
  // 해당 전략에 대한 실행부는 따로 분리가되어있음..
  run() {
    this.strategy.run();
  }
}

class BusStrategy {
  run() {
    console.log("Bus로 이동~~~~!");
  }
}
class WalkStrategy {
  run() {
    console.log("걸어서 이동~~~~!");
  }
}

// 전략가 패턴을 사용한 유연한 방법.
const s = new StrategyRunner();
s.setStrategy(new BusStrategy());
s.run(); // Bus전략의 Run수행.
s.setStrategy(new WalkStrategy());
s.run(); // Walk전략의 run수행.
 

 

 

 

 


 

☆Observer(옵저버) 패턴  - 완성여부를 반복확인하기 어려우니, 완성시 통보받는 패턴 ★

. A(구매자)는 check라는 함수로 B(제공자)가 다 만들었는 지 확인한다.   (완성 시, getItem() 함수로 결과를 가져온다. )

. B(제공자)가 만들지 않았다면 만들 때 까지 계속 물어봐야 되는 단점이 있다. 

. B(제공자)가 늦게 만들면 만들수록 계속 물어봐야되기 때문에 시간낭비가 될 수있다.

class A {
  check(b) {
    if (b.finished()) {
      return b.getItem();
    }

    return false;
  }
}

class B {
  item = null;

  finished() {
    return !!this.item;
  }

  getItem() {
    return this.item;
  }
}

const b = new B();
const a = new A();

while (!a.check(b)) {}

 

  

. 주기적으로 자꾸 다 됐냐고 물어보는게 아니라 다되면 알려주세요 하는게 옵저버패턴..  

  옵저버패턴으로 변경 시 아래와 같이 코드가 변경 될 수 있다..