// 裝飾器模式 運行時動態添加附加功能到對象中
/**
* 1 當我們有這樣一個場景:一個筆 造價是一元錢
* 如果跨省買這只筆增加一元錢運費
* 如果零售增值2元
* 如果打八折
*/
//es6實現
class Pen {
// 添加靜態方法
static decorate() {
return {
kuasheng: {
getPrice(price) {
return price + 1;
}
},
lingshou: {
getPrice(price) {
return price +2;
}
},
dazhe: {
getPrice(price) {
return price * .8;
}
}
}
}
constructor(price) {
this.price = price; //類的實例屬性初始化價格
this.decorate_list = [];// 存放裝飾器的數組
}
decorate(decorate) { // 類提供的裝飾方法
this.decorate_list.push(decorate);
}
getPrice() {
let price = this.price;
this.decorate_list.forEach(res => {
price = Pen.decorate()[res].getPrice(price);
})
return price;
}
}
let pen = new Pen(1);// 出廠價是一元錢 這里可以自定義
pen.decorate('lingshou');// 讓它零售
pen.decorate('kuasheng');// 讓它跨省
console.log(pen.getPrice());// 4
let pen2 = new Pen(1);
pen2.decorate('lingshou');// 讓它零售
pen2.decorate('kuasheng');// 讓它跨省
pen2.decorate('dazhe');// 讓它打折
console.log(pen2.getPrice());// 3.2