Stai sviluppando un software per il menù di una pizzeria. Ogni pizza ha un prezzo base e una serie di aggiunte disponibili che l’utente può scegliere. Ogni aggiunta ha un prezzo opzionale diverso e le scelte sono molte e potenzialmente variabili nel tempo.
Descrivi quale design pattern useresti per risolvere il problema motivando la risposta. Fornisci anche una rappresentazione in codice, pseudo-codice o diagramma delle classi della soluzione proposta.
Soluzione
Come per l’oracolo, si può risolvere questo problema usando il Decorator. In questo modo è possibile aggiungere un numero illimitato di ingredienti senza modificare la classe base Pizza
.
Esempio di implementazione
interface IPizza {
name: string
price: number
}
class Pizza implements IPizza {
name: string
price: number
constructor(name: string, price: number) {
this.name = name
this.price = price
}
}
abstract class PizzaDecorator implements IPizza {
protected pizza: IPizza
constructor(pizza: IPizza) {
this.pizza = pizza
}
get name(): string {
return this.pizza.name
}
get price(): number {
return this.pizza.price
}
}
class PizzaWithMushrooms extends PizzaDecorator {
get name(): string {
return `${this.pizza.name} + mushrooms`
}
get price(): number {
return this.pizza.price + 1.5
}
}
class PizzaWithWholeWheat extends PizzaDecorator {
get name(): string {
return `${this.pizza.name} + whole wheat`
}
get price(): number {
return this.pizza.price + 2
}
}
const pizza = new Pizza("Margherita", 5)
console.log("Base pizza: " + pizza.name + " - €" + pizza.price)
const pizza2 = new PizzaWithMushrooms(pizza)
console.log("Pizza with additions: " + pizza2.name + " - €" + pizza2.price)
const pizza3 = new PizzaWithWholeWheat(pizza2)
console.log("Pizza with additions: " + pizza3.name + " - €" + pizza3.price)
Output di esempio
Base pizza: Margherita - €5
Pizza with additions: Margherita + mushrooms - €6.5
Pizza with additions: Margherita + mushrooms + whole wheat - €8.5