⭐데코레이터 패턴

객체에 새로운 인터페이스를 더해 새로운 기능을 추가하고 객체의 연결성을 추가 시켜주는 패턴

실제 적용 예시

  • 비올때 옷을 입고 추울때 털모자를 쓴다 등의 새로운 환경에 적응 하기위해 새로운 객체로 랩핑하는 것을 예시로 들수 있다.
class Beverage { // 이 클래스는  건드리지 않습니다.
  let cost;
}
class DecoratorBeverage extends Beverage {
  cost() {
    throw 'You must be override this function!';
  }
}

class Americano extends DecoratorBeverage {
  cost() {
    return 4000;
  }
}

class CaffeLatte extends DecoratorBeverage {
  cost() {
    return 5000;
  }
}

class Cream extends DecoratorBeverage {
  constructor(beverage) {
    this.beverage = beverage;
  }

  cost() {
    return this.beverage.cst() + 300;
  }
}

class Shot extends DecoratorBeverage {
  constructor(beverage) {
    this.beverage = beverage;
  }

  cost() {
    return this.beverage.cst() + 500;
  }
}

class Milk extends DecoratorBeverage {
  constructor(beverage) {
    this.beverage = beverage;
  }

  cost() {
    return this.beverage.cst() + 300;
  }
}

const americano = new Americano();
americano = new Shot(americano);
americano = new Milk(americano);

console.log('cost : ', americano.cost()); // 4800

언제 사용할까 ?

클래스를 수정하지 않고 클래스 멤버들의 정의를 수정 및 기능을 확장할 수 있습니다. 따로 자식을 만들거나 하지 않고도 확장을 할 수 있습니다.(랩핑으로)

장점

  • 여러 행동을 할수 있는 객체를 하나의 객체를 파생하여 만들수 있다.
  • 메타프로그래밍이 가능하다!

단점

  • 래퍼 스택이 쌓인다.
    • 순서상의 의존성이 생긴다.
    • 불필요해? 보이는 계층구조를 갖게 된다.