디자인 패턴 - 구조 패턴(⭐데코레이터)
⭐데코레이터 패턴
객체에 새로운 인터페이스를 더해 새로운 기능을 추가하고 객체의 연결성을 추가 시켜주는 패턴
실제 적용 예시
- 비올때 옷을 입고 추울때 털모자를 쓴다 등의 새로운 환경에 적응 하기위해 새로운 객체로 랩핑하는 것을 예시로 들수 있다.
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
언제 사용할까 ?
클래스를 수정하지 않고 클래스 멤버들의 정의를 수정 및 기능을 확장할 수 있습니다. 따로 자식을 만들거나 하지 않고도 확장을 할 수 있습니다.(랩핑으로)
장점
- 여러 행동을 할수 있는 객체를 하나의 객체를 파생하여 만들수 있다.
- 메타프로그래밍이 가능하다!
단점
- 래퍼 스택이 쌓인다.
- 순서상의 의존성이 생긴다.
- 불필요해? 보이는 계층구조를 갖게 된다.