/*Decorator
The Decorator pattern is a design pattern lets you dynamically change
the behavior of an object at run time
and it's communly used in frameworks like Angular.
And you can implement the Decorator pattern in Typescript is very
easy and you can use the decorator module.
Again imagine you want to make a pizza and you want to make it
with tomato sauce, cheese and ham but you don't want to repeat the
same steps for every pizza you make
First you need to make a pizza class:
*/
class Pizza {
public makePizza() {
console.log('Making a pizza...');
}
}
// Then you make a decorator class that will decorate the pizza class:
class PizzaDecorator extends Pizza {
constructor(public pizza: Pizza) {
super();
}
public makePizza() {
this.pizza.makePizza();
}
}
// Then you make a concrete decorator class that extends the decorator class to add the cheese:
class CheeseDecorator extends PizzaDecorator {
constructor(pizza: Pizza) {
super(pizza);
}
public makePizza() {
super.makePizza();
console.log('Adding cheese...');
}
}
// Then you make a concrete decorator class that extends the decorator
// class to add the ham:
class HamDecorator extends PizzaDecorator {
constructor(pizza: Pizza) {
super(pizza);
}
public makePizza() {
super.makePizza();
console.log('Adding ham...');
}
}
// Then you make a concrete decorator class that extends the decorator
// class to add the mushrooms:
class MushroomDecorator extends PizzaDecorator {
constructor(pizza: Pizza) {
super(pizza);
}
public makePizza() {
super.makePizza();
console.log('Adding mushrooms...');
}
}
// Then you make your pizza:
const pizza = new CheeseDecorator(new HamDecorator(new MushroomDecorator(new Pizza())));
pizza.makePizza();
// as you can see the decorator pattern uses nested classes and
// inheritance to add new functionality to an object.