viernes, 1 de junio de 2007

Implementando el Patrón Decorador con Visual Fox Pro

Siguiendo la misma línea del artículo anterior, vamos a implementar el patrón decorador en Visual Fox Pro.





Dentro de un prg para mi caso ejemplos.prg vamos a escrbir las clases:






DEFINE CLASS IComponente as Custom
FUNCTION procesarNombres()
LPARAMETERS nombre,apellido
endfunc
ENDDEFINE



DEFINE CLASS puente as Icomponente

Caracter= ", "

PROCEDURE Caracter_ACCESS
RETURN THIS.Caracter
ENDPROC

PROCEDURE Caracter_ASSIGN
LPARAMETERS Valor
THIS.Caracter=Valor
ENDPROC

FUNCTION procesarNombres()
LPARAMETERS nombre,apellido
RETURN ALLTRIM(Apellido) + this.Caracter + ALLTRIM(nombre)
ENDFUNC

ENDDEFINE



DEFINE CLASS decorador as Icomponente

componente=null

PROCEDURE init ()
LPARAMETERS clase
this.componente=clase
ENDPROC

FUNCTION procesarNombres()
LPARAMETERS nombre,apellido
RETURN this.componente.procesarNombres(nombre,apellido)
ENDFUNC

ENDDEFINE


DEFINE CLASS AgregarNumeracion as decorador

padre=null

Numero= 1

PROCEDURE Numero_ACCESS
RETURN THIS.Numero
ENDPROC

PROCEDURE Numero_ASSIGN
LPARAMETERS Valor
THIS.Numero=Valor
ENDPROC

Separador= " - "

PROCEDURE Separador_ACCESS
RETURN THIS.Separador
ENDPROC

PROCEDURE Separador_ASSIGN
LPARAMETERS Valor
THIS.Separador=Valor
ENDPROC

PROCEDURE init ()
LPARAMETERS clase
this.padre=NEWOBJECT("decorador",'','',clase)
ENDPROC

FUNCTION procesarNombres()
LPARAMETERS nombre,apellido
RETURN ALLTRIM(STR(this.numero))+ this.separador + this.padre.procesarNombres(nombre,apellido)
ENDFUNC

ENDDEFINE

DEFINE CLASS AgregarNacionalidad as decorador

padre=null

Nacionalidad= "Argentina"

PROCEDURE Nacionalidad_ACCESS
RETURN THIS.Nacionalidad
ENDPROC

PROCEDURE Nacionalidad_ASSIGN
LPARAMETERS Valor
THIS.Nacionalidad=Valor
ENDPROC

Separador= " - "

PROCEDURE Separador_ACCESS
RETURN THIS.Separador
ENDPROC

PROCEDURE Separador_ASSIGN
LPARAMETERS Valor
THIS.Separador=Valor
ENDPROC


PROCEDURE init ()
LPARAMETERS clase
this.padre=NEWOBJECT("decorador",'','',clase)
ENDPROC

FUNCTION procesarNombres()
LPARAMETERS nombre,apellido
RETURN this.padre.procesarNombres(nombre,apellido) + this.separador + this.nacionalidad
ENDFUNC

ENDDEFINE






Ya estamos listos para consumir las clases. Creamos el mismo formulario que para C#:



En el Init del formulario hacemos una referencia al archivo de las clases...


SET PROCEDURE TO "ejemplos.prg"

En el primer botón colocamos...


MiPuente = NEWOBJECT("puente")
ThisForm.txt1.Value=MiPuente.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
RELEASE MiPuente

En el segundo...


MiPuente = NEWOBJECT("puente")
*agrego los decoradores
deco1 = NEWOBJECT("AgregarNumeracion",'','',MiPuente)
*llamo al método
ThisForm.txt2.Value=deco1.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
*elimino los objetos
RELEASE MiPuente
RELEASE deco1

En el tercero...


MiPuente = NEWOBJECT("puente")
*agrego los decoradores
deco2 = NEWOBJECT("AgregarNacionalidad",'','',MiPuente)
deco2.nacionalidad=thisform.txtNacionalidad.value
*llamo al método
ThisForm.txt3.Value=deco2.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
*elimino los objetos
RELEASE MiPuente
RELEASE deco2

En el cuarto...


MiPuente = NEWOBJECT("puente")
*agrego los decoradores
deco1 = NEWOBJECT("AgregarNumeracion",'','',MiPuente)
deco2 = NEWOBJECT("AgregarNacionalidad",'','',deco1)
deco2.nacionalidad=thisform.txtNacionalidad.value

*llamo al método
ThisForm.txt4.Value=deco2.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
*elimino los objetos
RELEASE MiPuente
RELEASE deco1
RELEASE deco2

y por último en el quinto...


*agrego los decoradores
deco2 = NEWOBJECT("AgregarNacionalidad",'','',NEWOBJECT("AgregarNumeracion",'','',NEWOBJECT("puente")))
deco2.nacionalidad=thisform.txtNacionalidad.value
*llamo al método
ThisForm.txt5.Value=deco2.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
*elimino los objetos
RELEASE deco2

Como se puede ver, al igual que en artículo anterior, con una sola línea se puede agregar funcionalidad de forma dinámica al objeto.


deco2 = NEWOBJECT("AgregarNacionalidad",'','',NEWOBJECT("AgregarNumeracion",'','',NEWOBJECT("puente")))

El patrón decorador es muy útil en ambientes multiempresa, por ejemplo, donde las reglas de negocio son muy cambiantes entre sí, e incluso entre sucursales. Con este patrón se podría manejar de forma más eficiente la diversidad de funcionalidades que el trabajo multiempresa significa.


No hay comentarios.: