Decorator Pattern
- Sprouting
- c.
The decorator pattern is a structural design pattern for attaching additional functionality to existing objects by “wrapping” them in a new type of object.
Example
Real-world analogy: layering items of clothing
design-patterns/src/structural/decorator.ts at main
Component
An item of clothing (apparel) can be worn. Both base layers, like a T-shirt, and additional layers have this in common.
interface Apparel { wear(): void;}
class TShirt implements Apparel { wear() { console.log("Wearing: t-shirt"); }}Decorator
A layer wraps an item of clothing allowing both items to be worn.
class Layer implements Apparel { private apparel: Apparel;
constructor(apparel: Apparel) { this.apparel = apparel; }
wear() { this.apparel.wear(); }}
class Jacket extends Layer { override wear() { super.wear(); console.log("Wearing: jacket"); }}Client
Calling the wear method on a layer object calls the wear method on the wrapped object.
let apparel = new TShirt();apparel.wear();// Expected output:// Wearing: t-shirt
apparel = new Jacket(apparel);apparel.wear();// Expected output:// Wearing: t-shirt// Wearing: jacket