La mayoría conoce el ejemplo de pizza/café para el patrón de decorador.Orden de decoraciones en Decorator Pattern
Pizza* pizza1 = BigPizzaDecorator(MushromDecorator(SimplePizza()));
Pizza* pizza2 = MushromDecorator(BigPizzaDecorator(SimplePizza()));
los dos se comportan objeto de una manera similar, pero no del todo, especialmente si usted tiene la operación no conmutativa, por ejemplo:
BigPizzaDecorator::price() { return 10 + PizzaDecorator::price(); } // this is commutative
BigPizzaDecorator::name() { return "big " + PizzaDecorator::name(); } // this is not commutative
Por lo tanto el precio de pizza1
y pizza2
son los mismos , pero el nombre no es, por ejemplo, el primero debe ser "Big mushroom pizza"
, el segundo "Mushroom big pizza"
. El primero es correcto en inglés (probablemente sea mejor "Big pizza with mushroom", pero no es tan importante).
El libro "de cabeza" señalar este problema con el ejemplo Cofee:
Cuando tenga que mirar en múltiples capas en la cadena de decorador, que están empezando a empujar el decorador más allá de su verdadera intención .
Sin embargo, tales cosas son posibles. Imagine un CondimentPrettyPrint decorador que analiza la decription final y puede imprimir “Mocha, Whip, Mocha” como “Whip, Doble Mocha.”
cuál es la mejor manera de hacerlo? (operator<
?)
no importa cuál, el punto es que quiero la misma salida para 'pizza1.name()' y 'pizza2.name()'. –