Decorator Pattern (VFP)

(Difference between revisions)
Jump to: navigation, search
(Como funciona un Decorador)
(Introducción)
Line 1: Line 1:
 
==Introducción==
 
==Introducción==
El patrón de diseño ''Decorador'' ([http://en.wikipedia.org/wiki/Decorator_pattern Decorator Pattern] es una técnica que permite extender la funcionalidad de una clase sin hacer uso de la herencia. Si bien siempre ha habido una discusion sobre cuando usar '''Decoradores''' en lugar de '''subclases''', lo cierto es que hay muchas ocasiones en donde el uso de un decorador puede solucionar un requerimiento dado y evitar el crecimiento desmedido del arbol de herencia en una clase dada.   
+
El patrón de diseño ''Decorador'' ([http://en.wikipedia.org/wiki/Decorator_pattern Decorator Pattern]) es una técnica que permite extender la funcionalidad de una clase sin hacer uso de la herencia. Si bien siempre ha habido una discusion sobre cuando usar '''Decoradores''' en lugar de '''subclases''', lo cierto es que hay muchas ocasiones en donde el uso de un decorador puede solucionar un requerimiento dado y evitar el crecimiento desmedido del arbol de herencia en una clase dada.   
  
 
Adicionalmente, el uso de decoradores anidados permite simular la función de multiherencia en lenguajes donde esta característica no es soportada (como es el caso de VIsual FoxPro).
 
Adicionalmente, el uso de decoradores anidados permite simular la función de multiherencia en lenguajes donde esta característica no es soportada (como es el caso de VIsual FoxPro).
 
  
 
==Como funciona un Decorador==
 
==Como funciona un Decorador==

Revision as of 07:26, 15 April 2012

Introducción

El patrón de diseño Decorador (Decorator Pattern) es una técnica que permite extender la funcionalidad de una clase sin hacer uso de la herencia. Si bien siempre ha habido una discusion sobre cuando usar Decoradores en lugar de subclases, lo cierto es que hay muchas ocasiones en donde el uso de un decorador puede solucionar un requerimiento dado y evitar el crecimiento desmedido del arbol de herencia en una clase dada.

Adicionalmente, el uso de decoradores anidados permite simular la función de multiherencia en lenguajes donde esta característica no es soportada (como es el caso de VIsual FoxPro).

Como funciona un Decorador

Un decorador no es mas que una clase que expone todos los métodos y propiedades de otra clase, ademas de los propios. Supongamos que tenemos una clase Usuario que implementa la siguiente interfaz:

DEFINE CLASS Usuario AS Custom
 Login = ""
 Password = ""
 nombreCompleto = ""
 
 PROCEDURE verificarPassword
 PROCEDURE Login
 PROCEDURE Logout
ENDDEFINE


Como vemos, esta clase representa los datos básicos de un usuario y las operaciones que este puede realizar. Supongamos que ahora queremos incluir la posibilidad de que el usuario pueda cambiar su password. Una forma de hacer esto seria modificar la definición de la clase Usuario directamente, pero supongamos que por cualquier razón eso no es posible. Otra solución seria crear una subclase de Usuario y añadir la funcionalidad allí. Finalmente, otra opción es crear un decorador:

DEFINE CLASS Usuario2 AS Custom
 HIDDEN oUsuario
 Login = ""
 Password = ""
 nombreCompleto = ""
 
 PROCEDURE Init  && Al crear la clase se crea una instancia de la clase real
  THIS.oUsuario = CREATE("Usuario")
 ENDPROC
 
 * Se programan Setters y Getters para cada propiedad de la clase real
 PROCEDURE Login_Access
  RETURN THIS.oUsuario.Login
 ENDPROC
 PROCEDURE Login_Assign(vNewVal)
  THIS.oUsuario.Login = m.vNewVal
 ENDPROC
 PROCEDURE Passsword_Access
  RETURN THIS.oUsuario.Password
 ENDPROC
 PROCEDURE Password_Assign(vNewVal)
  THIS.oUsuario.Password = m.vNewVal
 ENDPROC
 PROCEDURE nombreCompleto_Access
  RETURN THIS.oUsuario.nombreCompleto
 ENDPROC
 PROCEDURE nombreCompleto_Assign(vNewVal)
  THIS.oUsuario.nombreCompleto = m.vNewVal
 ENDPROC 
 
 * Se implementan todos los metodos de la clase real, invocando el metodo directamente en la instancia de la clase
 PROCEDURE verificarPassword(pcPwd)
  RETURN THIS.oUsuario.verificarPassword(pcPwd)
 ENDPROC
 PROCEDURE Login
  RETURN THIS.oUsuario.Login
 ENDPROC
 PROCEDURE Logout
  RETURN THIS.oUsuario.Logout
 ENDPROC
 
 * Se implementan los nuevos metodos que extienden la funcionalidad de la clase original
 PROCEDURE cambiarPassword(pcOldPwd, pcNewPwd)
 
ENDDEFINE


Como vemos, el decorador cumple dos funciones básicas:

  • Implementa toda la interfaz de la clase que se esta decorando
  • Implementa los nuevos metodos y propiedades que extienden la funcionalidad de la clase original


Tambien es obvio con este ejemplo que crear un decorador de una clase con una interfaz grande puede llegar a ser un trabajo tedioso. Justamente esta ultima parte es lo que me habia mantenido alejado del uso de decoradores.... hasta ahora.


La clase DecoratorPattern

La clase DecoratorPattern permite implementar un decorador de una clase cualquiera sin necesidad de recrear la interfaz del objeto que se desea decorar. En su lugar, la clase hace uso de las capacidades de reflexión de VFP y de la posibilidad en VFP de crear un accesor sobre la propiedad THIS para lograr el mismo efecto sin necesidad de escribir código. Utilizando la clase DecoratorPattern, la clase Usuario2 se reduce a esto:

DEFINE CLASS Usuario2 AS DecoratorPattern
 className = "Usuario"
 
 * Se implementan los nuevos metodos que extienden la funcionalidad de la clase original
 PROCEDURE cambiarPassword(pcOldPwd, pcNewPwd)
ENDDEFINE
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox