Decorator Pattern (VFP)

(Difference between revisions)
Jump to: navigation, search
VictorEspina (Talk | contribs)
(Created page with "==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...")
Newer edit →

Revision as of 07:16, 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


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
  THIS.oUsuario = CREATE("Usuario")
 ENDPROC
 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 
 
 PROCEDURE verificarPassword(pcPwd)
  RETURN THIS.oUsuario.verificarPassword(pcPwd)
 ENDPROC
 PROCEDURE Login
  RETURN THIS.oUsuario.Login
 ENDPROC
 PROCEDURE Logout
  RETURN THIS.oUsuario.Logout
 ENDPROC
 
ENDDEFINE
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox