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.:
Publicar un comentario