lunes 23 de abril de 2007

Patrones de diseño: Decorator

Hola bienvenido a mi serie de post que he llamado "Patrón de diseño en 10 minutos", hoy comienzo por el patrón Decorator.

La idea de estos post no es dar tanto ejemplo en código si no explicarlo en el lenguaje humano lo más claro posible, pues así quedan más claros los conceptos. Si no resulta me comprometo a poner ejemplos - así les obligo a dejar comentarios.

Vamos, antes les debo recordar que en general se usan interfaces, clases abstractas y métodos abstractos para determinar los comportamientos de los objetos.

Es un poco dificil de entender esto de comportamiento en los objetos, pues mucha gente simplemente agrupa una serie de métodos desde sus "librerías"; espero ayudar a que quede claro que el camino de la orientación a objetos va por otro lado.

Patrón decorador:

Supone que vas a un hotel, cada noche de hotel en habitación compartida tiene un precio base de 100$.

A mitad de la noche se te ocurre bajar a la piscina y la entrada vale $5.

Luego de la piscina pides comida (en tu habitación), esta comida tiene un precio de $10.

¿Cuanto sería el total? , sería un poco dificil de obtener datos al tener una array o alguna estructura de todos los objetos pues estos objetos son de distintas clases y prbablemente de distintos métodos.

Cual es la solución, pues el patrón decorador, simplemente cada cosa nueva que pides tiene un atributo que es un objeto del precio base que se va actualizando y cuando creas el objeto "adicional" simplemente le vas pasando ese objeto, de esta forma para obtener la cuenta la obtienes desde el último objeto "adicional" creado.


Algo así como (en pseudo código):

cuenta = new Habitacion(); // existe el método costo que devuelve 100.
cuenta = new TicketPiscina(cuenta); //existe el método costo que devuelve this.cuenta.getCosto() + this.costo() o sea 100 + 5
cuenta = new ComidaHabitacion(cuenta); //existe el método costo que devuelve this.cuenta.getCosto() + this.costo() o sea 105 + 10

Y para obtener el precio sería simplemente : precio = cuenta.costo();

Vamos, ¿se entiende?

Saludos!

3 comentarios:

Rodrigo A. Aguilar dijo...

Vamos, que ezto eztá de pucha madre tio!

Luis Sepúlveda dijo...

joder coño!
que no he entendio nada!
será que soy un gilipollas, o será que estoy flipando en colores, joder!!

Christian González G. dijo...

Poz tio, que no sabía que estuvieras tan acojonao con el ezpañol, HOYGAN!