Quiero salvar una lista de usuarios registrados, pero no sÈ exactamente donde. La cuestiÛn es que dependiendo del valor de un checkbox ( en el que el usuario elige si est· conectado a internet o no ), debo mandar los datos a servidor ( en formato XML ) o guardarlos en disco en un Shared Object
°Esta es una misiÛn para el patrÛn Proxy. ø Por quÈ?. Porque quiero aislar el proceso de guardar los datos del resto del programa, simplemente quiero decir, "eh, guardame esto" y olvidarme de cÛmo o dÛnde se guarda.
Eso es lo que hace este patrÛn. El proxy guarda una referencia a un objeto, que es quien realmente se encargar· de ejecutar la acciÛn. Pero es el proxy el que crea ese objeto, por lo que puede crear una instancia de una u otra clase dependiendo de ciertas condiciones en tiempo de ejecuciÛn
Por tanto, todas las clases que puedan ser instanciadas por el proxy, deben implementar el mismo interfaz. Y dependiendo del tipo de proxy, puede ser una buena idea que incluso Èl mismo implemente ese interfaz, para que se pueda eliminar si es necesario.
Basta ya de literatura. Primero, el interface:
interface ISaveable
{
public function saveUserList( theList: Array );
}
Sencillo, øno?. Queremos salvar una lista de usuarios, por lo tanto hemos definido un mÈtodo saveUserList
Ahora, la clase que se encarga de enviar los datos a servidor
class myXML extends XML implements ISaveable
{
private var userArray: Array;
function myXML( )
{
this.userArray = new Array( );
}
function sendData( )
{
//this.sendAndLoad( );
}
public function saveUserList( theList: Array )
{
trace( "The XML is handling the data" );
this.userArray = theList;
//create the XML nodes, and send to server
}
}
Nada complicado. Simplemente un mÈtodo p˙blico que recibe el array de usuarios, que se utilizar· para crear el XML que se enviar· a servidor
Bien, ahora la clase que guarda los datos en disco:
class mySO implements ISaveable
{
private var theSO: SharedObject;
private var userArray: Array;
function mySO( )
{
this.userArray = new Array( );
}
public function saveUserList( theList: Array )
{
trace( "The Shared Object handles the data" );
this.userArray = theList;
}
}
Esta clae implementa ISaveable, y al recibir los datos, intentar· guardarlos en un Shared Object
Ahora la parte compleja. En este ejemplo, he representado el valor del checkbox ( el estado de la conexiÛn ) utilizando una variable en _root. Pero para obtener el valo9r de esa variable, voy a utilizar un singleton. Simplemente, porque me parece una manera mejor, en este caso, que hacer una referencia directa a _root desde el proxy
class singleton {
private static var inst:singleton;
private function singleton() {}
public static function get instance():singleton {
if (inst == null) inst = new singleton();
return inst;
}
public function isConnected( ): Boolean {
return _root.connected;
}
}
Y, por fin, el proxy
class saveUserListProxy implements ISaveable
{
private var realClass: ISaveable;
function saveUserListProxy( )
{
var config: singleton = singleton.instance;
var conFlag: Boolean = config.isConnected( );
if ( conFlag )
{
this.realClass = ISaveable( new myXML( ) );
}
else
{
this.realClass = ISaveable( new mySO( ) );
}
}
public function saveUserList( theList: Array )
{
this.realClass.saveUserList( theList );
}
}
Y finalmente, en este ejemplo, en la lÌnea de tiempo principal tendrÌamos:
var connected: Boolean = false;
var theUserList: Array = new Array( );
theUserList.push( { id: 0, name: "Cesar" } );
theUserList.push( { id: 1, name: "Javier" } );
var myProxy: saveUserListProxy = new saveUserListProxy( );
myProxy.saveUserList( theUserList );
Podeis probar que todo funciona cambiando el valor de la variable "connected"
Y eso es todo. Son casi las dos de la maÒana de otra jornada laboral de casi 11 horas. Creo que ya va siendo hora de irse a la cama.....