Debemos crear el contexto, la estrategia abstracta, etc, etc...
Veamos un poco de código:
*Interfaz
DEFINE CLASS IComponente as Custom
FUNCTION procesarNombres()
LPARAMETERS nombre,apellido
endfunc
ENDDEFINE
*estrategia concreta
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
*estrategia concreta
DEFINE CLASS NombreApellido 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(nombre) + this.Caracter + ALLTRIM(Apellido)
ENDFUNC
ENDDEFINE
*estrategia concreta
DEFINE CLASS Enriquecido 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 "Apellido: " + ALLTRIM(Apellido) + this.Caracter + "Nombre: " + ALLTRIM(nombre)
ENDFUNC
ENDDEFINE
*clase de contexto
DEFINE CLASS contexto as Custom
MiClase= null
PROCEDURE MiClase_ACCESS
RETURN THIS.MiClase
ENDPROC
PROCEDURE MiClase_ASSIGN
LPARAMETERS Valor
THIS.MiClase=Valor
ENDPROC
PROCEDURE init()
LPARAMETERS Clase
This.MiClase=Clase
ENDPROC
ENDDEFINE
*estrategia abstracta
DEFINE CLASS Estrategia as Icomponente
contexto= " "
PROCEDURE contexto_ACCESS
RETURN THIS.contexto
ENDPROC
PROCEDURE contexto_ASSIGN
LPARAMETERS Valor
THIS.contexto=Valor
ENDPROC
PROCEDURE init()
LPARAMETERS Clase
This.contexto=Clase
ENDPROC
FUNCTION procesarNombres()
LPARAMETERS nombre,apellido
RETURN this.contexto.MiClase.procesarNombres(nombre,apellido)
ENDFUNC
ENDDEFINE
Se agregaron dos estrategias además de Puente: NombreApellido y Enriquecido. Las misma realizan distintas acciones para tener de ejemplo.
Veamos ahora como utilizar esto en un formulario:
Al presionar cada botón estamos utilizando una estrategia distinta.
El código del primer botón:
Estrategia = NEWOBJECT("Estrategia",'','',NEWOBJECT("contexto",'','',NEWOBJECT("NombreApellido")))
ThisForm.txt1.Value=Estrategia.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
RELEASE Estrategia
El código del segundo botón:
Estrategia = NEWOBJECT("Estrategia",'','',NEWOBJECT("contexto",'','',NEWOBJECT("Puente")))
ThisForm.txt2.Value=Estrategia.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
RELEASE Estrategia
Estrategia = NEWOBJECT("Estrategia",'','',NEWOBJECT("contexto",'','',NEWOBJECT("Enriquecido")))
ThisForm.txt3.Value=Estrategia.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
RELEASE Estrategia
En el init del formulario:
SET PROCEDURE TO "estrategia.prg"
donde "estrategia.prg" es el archivo donde están escritas las clases.
Cambiar de una estrategia a otra es muy simple. En entornos donde la tasa de cambios es muy alta este tipo de metodología es excelente.
En las siguientes publicaciones veremos cómo utilizar varios patrones a la vez.-
No hay comentarios.:
Publicar un comentario